Windows 7用のVisual Studio 2008 C++アプリケーションを使用して、ファイルを変更したいと思っています。Windows 7の変更点を調べるファイル
ファイルは次のように変更することがあります。
std::ofstream myfile_;
void LogData(const char* data)
{
myfile_ << data << std::endl;
// note that the file output buffer is flushed by std::endl, but the file is not closed.
}
私はFILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_LAST_ACCESS | FILE_NOTIFY_CHANGE_SECURITY | FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_FILE_NAME
フラグでReadDirectoryChangesWとFindFirstChangeNotificationの両方を使用してファイルのディレクトリを見て試してみました。しかし、これらのAPIのどちらも、ファイルハンドルが実際に閉じられるまでファイルの変更を検出しません。
ファイルが実際に書き込まれたときにファイルハンドルが閉じられる前に変更を検出する方法はありますか?エドウィンの提案@に
おかげで、 PaulH
更新 は、私は、ジャーナル機能を使用しようとしています。しかし、私はカップルの問題を抱えています。
- FSCTL_READ_USN_JOURNALは即座に戻ります。ブロックされません。 (しかし、これは問題2に関連しているかもしれません)
- 私のハンドルがどこに指しているかにかかわらず(私はディレクトリ "C:\ Foo \ Bar"と "C:\ Foo \ Bar" \ MyFile.txt ")私はC:ボリュームに何らかの変更を加えたようです。
FSCTL_READ_USN_JOURNAL
が私に与えるものを制限する方法はありますか?
簡潔にするため、エラーチェックは省略されています。
boost::shared_ptr<void> directory(
::CreateFileW(L"C:\\Foo\\Bar\\Myfile.txt",
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL),
::CloseHandle);
USN_JOURNAL_DATA journal = { 0 };
DWORD returned = 0;
::DeviceIoControl(directory.get(), FSCTL_QUERY_USN_JOURNAL, NULL, 0, &journal, sizeof(journal), &returned, NULL);
BYTE buffer[ 4096 ] = { 0 };
READ_USN_JOURNAL_DATA read = { 0, USN_REASON_DATA_EXTEND | USN_REASON_DATA_TRUNCATION, FALSE, 0, 0, journal.UsnJournalID };
::DeviceIoControl(directory.get(), FSCTL_READ_USN_JOURNAL, &read, sizeof(read), &buffer, sizeof(buffer), &returned, NULL);
for(USN_RECORD* record = (USN_RECORD*)(buffer + sizeof(USN));
((BYTE*)record - buffer) < returned;
record = (USN_RECORD*)((BYTE*)record + record->RecordLength))
{
ATLTRACE(L"%s\r\n", record->FileName);
}
出力例(これらのいずれもCにありません:\ Fooの\バーのディレクトリ):
AeXProcessList.txt`
AeXProcessList.txt`
AeXAMInventory.txt`
AeXAMInventory.txt`
AeXProcessList.txt`
AeXProcessList.txtP
access.log`
mysqlgeneral.log
E804.tmp
apache_error.log
E804.tmp
CHROME.EXE-5FE9909D.pfh
CHROME.EXE-5FE9909D.pfp
SyncData.sqlite3-journal
CHROME.EXE-5FE9909D.pfh
CHROME.EXE-5FE9909D.pfP
1211.tmp
SyncData.sqlite3-journal
AeXAMInventory.txt
よろしくお願いします。しかし、もう少し作業が必要です!私はあなたのためにいくつかの情報についてネットを検索しています。数分で戻ってください! –
は私が学んだことを発見しました:http://www.microsoft.com/msj/0999/journal/journal.aspxおよびhttp://www.microsoft.com/msj/1099/journal2/journal2.aspx –
ボリューム全体ではなく特定のファイルを監視するためのコード例と、指定されたシステムファイルだけでなく、すべてのシステムファイルを監視するようにも見えます。ただし、close()だけでなくflush()の後でもファイルの変更を検出できることに注意してください。だから、間違いなく他の方法よりも効果的です。 – PaulH