मुझे यह समझाया गया ReadDirectoryChangesW
समारोह तो मैं प्रभावी रूप से कई निर्देशिका में सामग्री के परिवर्तन के बारे में सूचित किया जा सकता है (ओवरराइट फ़ाइलें हट फ़ाइलें, नाम, आदि ..) का प्रयास करें।सी ++ WINAPI: ReadDirectoryChangesW() डबल सूचनाएं प्राप्त करना
मेरी हाल ही में टिप्पणियों में से एक, हर फ़ाइल लिखने आपरेशन के लिए, मैं हमेशा प्राप्त होने वाले एकल फाइल के लिए दो सूचनाएं है।
मैंने उस बहुत सावधानी से पता लगाया, और मुझे यकीन है कि अगर मैं एक फ़ाइल को ओवरराइट करता हूं (एक नई सामग्री के साथ एक .txt फ़ाइल कहें - मूल रूप से अतिरिक्त अक्षरों के अंदर जोड़े), ReadDirectoryChangesW()
मुझे उस फ़ाइल को बचाने के लिए दो बार सूचित करता है।
यह गंभीर बात है, क्योंकि मुझे प्रति परिवर्तन केवल एक बार अधिसूचित होने की उम्मीद है। मैं अनजाने में ऑपरेशन दोहराना नहीं चाहता हूं जो मेरे आवेदन में केवल एक बार होनी चाहिए।
क्या यह व्यवहार ज्ञात है? क्या प्राप्त करने का कोई तरीका है प्रति एक सूचना, कृपया? क्या प्रभावी ढंग से डबल सूचनाओं से बचने का कोई तरीका है?
मैं का उपयोग करें:
- अप्रबंधित सी ++
- Visual Studio 2012
- विंडोज 7 64
मैं बहुत बुनियादी कोड का उपयोग अपने परीक्षण करने के लिए है, लेकिन आप देखना चाहते हैं जाएगा यह, तो यहां यह है:
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;
}
}
सबसे पहले आप प्रत्येक लेखन ऑपरेशन कहते हैं, लेकिन फिर आपका उदाहरण ओवरराइट हो गया है। मैं अनुमान लगाता हूं कि ओवरराइटिंग में किसी मौजूदा फ़ाइल को लिखने/जोड़ने के विरोध में निर्देशिका के परिप्रेक्ष्य (जैसे कि डिलीट करें) से एक ही ऑपरेशन शामिल हो सकता है। लेकिन मेरे पास इस पर कोई आधिकारिक संदर्भ नहीं है ... – TheUndeadFish
[फाइलसिस्टमवॉचर डबल प्रविष्टियों] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/9902758/filesystemwatcher- डबल-entries) –
@TheUndeadFish, हाय और धन्यवाद आपके विचार के लिए। यह वास्तव में बहुत चालाक है। मैंने अपने परीक्षणों को एक और झंडे के साथ करने की कोशिश की। मैं कह सकता हूं, उदाहरण के लिए ** FILE_NOTIFY_CHANGE_ATTRIBUTES ** दो सूचनाएं भी देता है। यह समझाया जा सकता है कि फ़ाइल ओवरराइट पर, एक से अधिक विशेषता सामान्य रूप से बदल जाती है? –