2011-07-31 28 views
7

私のWindowsプログラムは、別のプログラムからディレクトリ/ファイルインターフェイスを介して情報を受け取ります。 これは、他のプログラムがファイルを特別なディレクトリにドロップすることです。私のプログラムは定期的にディレクトリをスキャンし、ファイルを見つけて処理してから削除します。排他アクセス用に開いたファイルを同じプロセスで削除する

私はCreateFile()関数を使ってこのようなファイルを開きます。他のプログラムがファイルへの書き込みを終了し、それを閉じたことを保証するために、私はdwShareModeパラメータを0に設定します。CreateFileが共有エラーで失敗した場合は、次の繰り返しまでファイルをスキップします。

問題は、プログラムでファイルを開いているときに、ERROR_SHARING_VIOLATIONエラーが発生して、DeleteFile()が失敗するという問題です。

削除する前にファイルを閉じることができましたが、ファイルを削除する直前に別のプログラムがファイルを開く可能性は避けてください。排他的にそれを削除したファイルを開いて、他のプログラムがopenningとファイルをdeletetingの間で干渉しないことができるように:

は、私はファイル

CreateFile(filePath,DELETE|FILE_READ_DATA,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL) 

それは私が欲しいものを達成することが可能である

を開くには、このコードを使用します。

答えて

3

dwShareModeの場合はFILE_SHARE_DELETEを渡します。これにより、ファイルを読み込んでいる間に他のアプリケーション(自分だけでなく)がDeleteFile()を呼び出すことができますが、DeleteFile()のドキュメントによれば、CloseHandle()を呼び出して読み取りを終了するまでは削除されませんハンドル。

DeleteFile機能は、ファイルを閉じるときに削除するようにマークします。したがって、 ファイルの最後のハンドルが閉じられるまで、ファイルの削除は発生しません。 ファイルを開くためのCreateFileへのその後の呼び出しは、 ERROR_ACCESS_DENIEDで失敗します。

他のアプリケーションでは、それぞれFILE_SHARE_READまたはFILE_SHARE_WRITEを指定しない限り、ファイルを読み書きできません。 FILE_SHARE_DELETEではファイルを移動できますが、それはそれです。

6

FILE_FLAG_DELETE_ON_CLOSEはおそらくあなたが探しているものです。 MSDN

から* FILE_FLAG_DELETE_ON_CLOSE 0x04000000 - ファイルには、そのハンドルのすべての直後に削除される指定されたハンドルと、他の開いているか、重複したハンドルを含む、閉鎖されています。 ファイルに開いているハンドルが存在する場合、FILE_SHARE_DELETE共有モードですべて開いていないかぎり、呼び出しは失敗します。 FILE_SHARE_DELETE共有モードが指定されていない限り、ファイルに対する後続のオープン要求は、失敗 *

EDITは:あなたの中にあなたがすべきと小文字、だから... ...

を例を追加しました:

HANDLE hFile = ::CreateFile(filePath, 
       DELETE|FILE_READ_DATA, 
       0, 
       NULL, 
       OPEN_EXISTING, 
       FILE_FLAG_DELETE_ON_CLOSE, 
       NULL); 

//use the file... 

::CloseHandle(hFile); //the file gets deleted when the handle is closed 
関連する問題