私の現在のプロジェクトでは、ファイルがまだコピーされているかどうかを確認する必要がありました。
特定のフォルダにある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;
}
}
}