سؤال

في نظام التشغيل Windows, هل هناك طريقة سهلة لمعرفة ما إذا كان المجلد يحتوي على subfile التي قد تغير ؟

أنا التحقق ، و تاريخ آخر تعديل على المجلد لا الحصول على تحديث عندما subfile التغييرات.

يوجد إدخال التسجيل يمكنني أن تعديل هذا السلوك ؟

إذا كان يهم, أنا باستخدام وحدة تخزين NTFS.

أود فى النهاية أن لديهم هذه القدرة من C++ البرنامج.

المسح الضوئي دليل بأكمله بشكل متكرر لا تعمل بالنسبة لي لأن المجلد كبيرة جدا.

تحديث:أنا حقا بحاجة إلى وسيلة للقيام بذلك دون عملية قيد التشغيل في حين أن التغيير يحدث.حتى تثبيت ملف مراقب النظام ليس الحل الأمثل بالنسبة لي.

Update2:الأرشيف بت لن تعمل لأنه لديه نفس المشكلة الماضي تاريخ التعديل.ملف أرشيف بت سيتم تعيين ، ولكن مجلدات لن.

هل كانت مفيدة؟

المحلول

هذا المادة ينبغي أن تساعد.أساسا ، يمكنك إنشاء واحد أو أكثر من إعلام كائن مثل:

HANDLE dwChangeHandles[2]; 
dwChangeHandles[0] = FindFirstChangeNotification( 
      lpDir,                          // directory to watch 
      FALSE,                          // do not watch subtree 
      FILE_NOTIFY_CHANGE_FILE_NAME);  // watch file name changes 

   if (dwChangeHandles[0] == INVALID_HANDLE_VALUE) 
   {
     printf("\n ERROR: FindFirstChangeNotification function failed.\n");
     ExitProcess(GetLastError()); 
   }

// Watch the subtree for directory creation and deletion.  
   dwChangeHandles[1] = FindFirstChangeNotification( 
      lpDrive,                       // directory to watch 
      TRUE,                          // watch the subtree 
      FILE_NOTIFY_CHANGE_DIR_NAME);  // watch dir name changes 

   if (dwChangeHandles[1] == INVALID_HANDLE_VALUE) 
   {
     printf("\n ERROR: FindFirstChangeNotification function failed.\n");
     ExitProcess(GetLastError()); 
   }

ثم عليك الانتظار لمدة الإخطار:

 while (TRUE) 
   { 
   // Wait for notification. 
      printf("\nWaiting for notification...\n");

      DWORD dwWaitStatus = WaitForMultipleObjects(2, dwChangeHandles, 
         FALSE, INFINITE); 

      switch (dwWaitStatus) 
      { 
         case WAIT_OBJECT_0: 

         // A file was created, renamed, or deleted in the directory.
         // Restart the notification. 
             if ( FindNextChangeNotification(dwChangeHandles[0]) == FALSE )
             {
               printf("\n ERROR: FindNextChangeNotification function failed.\n");
               ExitProcess(GetLastError()); 
             }
             break; 

         case WAIT_OBJECT_0 + 1: 

         // Restart the notification. 
             if (FindNextChangeNotification(dwChangeHandles[1]) == FALSE )
             {
               printf("\n ERROR: FindNextChangeNotification function failed.\n");
               ExitProcess(GetLastError()); 
             }
             break; 

         case WAIT_TIMEOUT:

         // A time-out occurred. This would happen if some value other 
         // than INFINITE is used in the Wait call and no changes occur.
         // In a single-threaded environment, you might not want an
         // INFINITE wait.

            printf("\nNo changes in the time-out period.\n");
            break;

         default: 
            printf("\n ERROR: Unhandled dwWaitStatus.\n");
            ExitProcess(GetLastError());
            break;
      }
   }
}

نصائح أخرى

ولعل هذا هو مبالغة ، ولكن طقم الاتحاد من MS أو FDDK من OSR قد يكون بديلا.إنشاء الخاصة بك الملفات برنامج تشغيل عامل التصفية مع بسيطة رصد كافة التغييرات إلى نظام الملفات.

ReadDirectoryChangesW

بعض ممتازة نموذج التعليمة البرمجية في هذه المادة CodeProject

إذا كان لا يمكنك تشغيل عملية عندما يحدث التغيير ، ثم ليس هناك الكثير يمكنك القيام به إلا مسح الملفات ، والتحقق من تعديل التاريخ/الوقت.هذا يتطلب منك أن تخزين كل ملف آخر التاريخ/الوقت ، رغم ذلك ، ومقارنة.

يمكنك تسريع هذا باستخدام بت الأرشيف (على الرغم من أنه قد خبط برنامج النسخ الاحتياطي, حتى المضي قدما بعناية).

أرشيف الشيء هو سمة الملف موجودة في الكمبيوتر مع العديد من أنظمة الملفات ، لا سيما FAT, FAT32, NTFS.على الغرض من أرشيف قليلا هو المسار تغييرات تدريجية إلى ملفات الغرض من النسخ الاحتياطي ، وتسمى أيضا الأرشفة.

كما أرشيف بت بت ثنائي ، إما 1 أو 0 أو في هذه الحالة أكثر كثيرا ما تسمى مجموعة (1) و واضح (0).نظام التشغيل يحدد بت الأرشيف في أي وقت ملف خلق, انتقل, إعادة تسمية, أو غير ذلك تعديل بأي شكل من الأشكال.بت الأرشيف ولذلك يمثل واحدا من اثنين الدول:"تغير" و "لم يتغير" منذ النسخ الاحتياطي الأخير.

أرشيف بت لا تتأثر ببساطة قراءة الملف.عندما ملف نسخ الملف الأصلي أرشيف بت لا يتأثر, ومع ذلك نسخ هذا بت الأرشيف سيتم تعيين وقت نسخة مصنوعة.

وبالتالي فإن العملية ستكون:

  1. الواضح بت الأرشيف على جميع الملفات
  2. اسمحوا نظام الملفات تتغير مع مرور الوقت
  3. مسح جميع الملفات - أي مع تعيين بت الأرشيف تغيرت

هذا سيقضي على الحاجة إلى البرنامج الخاص بك للحفاظ على الدولة ، وبما أنك فقط الذهاب أكثر من إدخالات الدليل (حيث بت يتم تخزين) وهم متفاوت المسافات, يجب أن تكون سريعة جدا.

إذا كان يمكنك تشغيل عملية خلال التغييرات ، ومع ذلك ، إذا كنت تريد أن ننظر إلى فيليسيستيمواتشير فئة.هنا على سبيل المثال كيف يمكن استخدامها.

كما هو موجود في .صافي (المستقبل الباحثين من هذا النوع من المشكلة)

ربما يمكنك ترك عملية قيد التشغيل على الجهاز يراقب التغيرات إنشاء ملف لك أن تقرأ في وقت لاحق.

-آدم

ربما يمكنك استخدام NTFS 5 تغيير المجلة مع DeviceIoControl كما هو موضح هنا

إذا كنت لا تعارض استخدام .صافي فيليسيستيمواتشير فئة سيتم التعامل مع هذا لك بسهولة إلى حد ما.

من ضعف بعد ذكر أحدهم:WMI مصدر الحدث

لا تزال تبحث عن إجابة أفضل على الرغم من.

لا شيء سهل إذا كان لديك تشغيل التطبيق يمكنك استخدام الملف Win32 إعلام تغيير واجهات برمجة التطبيقات (FindFirstChangeNotification) كما اقترح مع إجابات أخرى.تحذير:حوالي 2000 تريند مايكرو في الوقت الحقيقي من الفيروسات أن مجموعة التغييرات معا مما يجعل من الضروري استخدام كبيرة حقا مخازن عند طلب ملف تغيير نظام القوائم.

إذا لم يكن لديك تشغيل التطبيق ، يمكنك تشغيل ntfs اليومية و مسح مجلة التغييرات http://msdn.microsoft.com/en-us/library/aa363798(مقابل.85).aspx ولكن هذا يمكن أن يكون أبطأ من المسح الدليل بأكمله عندما # التغييرات أكبر من # من ملفات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top