2

私の現在のプロジェクトでは、ファイルがまだコピーされているかどうかを確認する必要がありました。

特定のフォルダにあるfile_added、file_removed、file_modified、file_renamedなどのOS通知を、対応するファイルパスとともに提供するライブラリをすでに開発しています。

ここでの問題は、たとえば1 GBのファイルを追加すると、ファイルのコピー中にfile_added、file_modified、file_modifiedなどの複数の通知が送信されることです。

ここで、ファイルがコピーされているかどうかを確認することで、これらの通知を超えることにしました。それに基づいて、私はイベントを無視します。

ファイルがコピーされているかどうかを通知する関数をc++で以下に記述しました。これは、入力としてファイルパスを取ります。詳細:-基本的に、WindowsAPI「CreateFile」を使用してファイルハンドルを取得します。ハンドルを取得できない場合は、ファイルがコピーされていると判断されます。

問題:-.rarおよび.exe形式の2 GBなどの一部の大きなファイルの場合、これは機能しません。これが正しいアプローチかどうか教えていただけますか?他のアプローチに感謝しない場合。

bool isFileBeingCopied(const boost::filesystem::path &filePath)
{
     //Log(INFO, "Checking if the given file is being copied or not for the file [%s]",filePath.string().c_str());
     HANDLE hFile = ::CreateFile(filePath.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
     DWORD dwLastError = GetLastError();

     if(hFile == NULL && hFile == INVALID_HANDLE_VALUE)
     {
          Log(INFO, "Gained invalid handle on the file - hence determining it, as being copied file [%s]",filePath.string().c_str());
          return true;
     }
     else
     {
          if(dwLastError == ERROR_SUCCESS )
          {
                CloseHandle(hFile);
                Log(INFO, "Able to gain the handle on the file - hence determining it, as copied file [%s]",filePath.string().c_str());
                return false;
          }
          else
          {
              Log(INFO, "Not able to gain the handle for the file - hence determining it, as being copied file [%s]",filePath.string().c_str());
              return true;
          }
     }               
}
4

3 に答える 3

0

ファイルが以前にdwShareMode= 0、IOW で排他アクセス モードで開かれている (そして現在も開かれている) 場合、ファイルがコピーされている (= に書き込まれている) かどうかに関係なく、ファイルを閉じるまで再度開くことはできません。 )またはそうでないため、関数の戻り値はtrue信頼できません。

CreateFile()成功した場合は、 を呼び出しCloseHandle()て返すことに注意してくださいfalsefalseこの直後に、ファイルは別のプロセスによって書き込み用に開かれる可能性があり、この場合も、この競合状態の可能性があるため、戻り値は信頼できません。これを防ぎたい場合は、ファイルへの排他的アクセスが不要になるまで、ハンドルを閉じてはなりません。

したがって、これは明らかに、ファイルがコピーされている (= 書き込まれている) かどうかを正確に判断する正しい方法ではありません。そして、それは無意味なことのように見えます。

ここで間違った問題を解決しようとしているように思えます。ファイルがコピーされている (= 書き込まれている) かどうかを確認することを決定したコンテキストでの本当の問題は何ですか? それを教えていただければ、その本当の問題を解決できるかもしれません。

于 2012-10-06T10:51:59.783 に答える