Tôi cố gắng tìm hiểu ReadDirectoryChangesW
chức năng vì vậy tôi có thể được thông báo một cách hiệu quả về việc thay đổi nội dung trong một số thư mục (file bị ghi đè, các file bị xóa, đổi tên, vv ..).C++ WINAPI: ReadDirectoryChangesW() Nhận Notifications đúp
Một trong những quan sát gần đây của tôi là, đối với mỗi tệp hoạt động ghi, tôi luôn nhận được hai thông báo cho một tệp.
Tôi đã theo dõi rất cẩn thận và chắc chắn rằng nếu tôi ghi đè lên một tệp (ví dụ: tệp .txt có nội dung mới - về cơ bản vài chữ cái bên trong), ReadDirectoryChangesW()
thông báo cho tôi hai lần cho mỗi tệp đó.
Đây là điều nghiêm trọng, vì tôi dự kiến chỉ được thông báo một lần cho mỗi thay đổi. Tôi không muốn vô tình lặp lại các hoạt động chỉ xảy ra một lần trong đơn của tôi.
Hành vi này có được xác định không? Có cách nào để chỉ nhận được một thông báo cho mỗi một thay đổi không? Có cách nào để có hiệu quả tránh thông báo kép không?
tôi sử dụng:
- Switch C++
- Visual Studio 2012
- Windows 7 x64
tôi sử dụng mã khá cơ bản để làm bài kiểm tra của tôi, nhưng bạn sẽ muốn xem nó ở đây là:
HANDLE hDir = CreateFile(
lpDir,
FILE_LIST_DIRECTORY,
FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL);
int nCounter = 0;
FILE_NOTIFY_INFORMATION strFileNotifyInfo[1024];
DWORD dwBytesReturned = 0;
while(TRUE)
{
if(ReadDirectoryChangesW (hDir, (LPVOID)&strFileNotifyInfo, sizeof(strFileNotifyInfo), FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE, &dwBytesReturned, NULL, NULL) == 0)
{
ErrorCheck(_T("Reading Directory Change"));
}
else
{
_tcout << _T("File Modified: ") << strFileNotifyInfo[0].FileName << endl;
_tcout << _T("Loop: ") << nCounter++ << endl;
}
}
Trước tiên, bạn nói mọi thao tác ghi, nhưng sau đó ví dụ của bạn sẽ được ghi đè. Tôi sẽ suy đoán rằng ghi đè có thể liên quan đến nhiều hơn một hoạt động từ góc nhìn của thư mục (chẳng hạn như xóa rồi tạo) thay vì chỉ viết/chắp thêm vào một tệp hiện có. Nhưng tôi không có bất kỳ tài liệu tham khảo có thẩm quyền nào về việc này ... – TheUndeadFish
có thể trùng lặp của [Mục nhập tệp hệ thống đồng hồ kép] (http://stackoverflow.com/questions/9902758/filesystemwatcher-double-entries) –
@TheUndeadFish, xin chào và cảm ơn bạn cho ý tưởng của bạn. Nó thực sự rất thông minh. Tôi đã thử các bài kiểm tra của mình với một lá cờ khác. Tôi có thể nói, ví dụ: ** FILE_NOTIFY_CHANGE_ATTRIBUTES ** cũng trả lại hai thông báo. Điều này có thể được giải thích, rằng trên tập tin ghi đè lên, nhiều hơn một thuộc tính thường được thay đổi? –