لماذا لا يكشف FileSystemWatcher التغييرات من Visual ستوديو؟

StackOverflow https://stackoverflow.com/questions/680698

سؤال

ولقد جعلت من تطبيق الصغيرة التي تستجيب للتغيرات في الملفات في مجلد. ولكن عندما تحرير الملف في Visual Studio 2008، فإنه لم يكتشف أي شيء. إذا كنت تعديل الملف في المفكرة بدلا من ذلك، كل شيء يعمل كما هو متوقع.

والبصرية بالتأكيد ستوديو يحفظ الملف في مرحلة ما، ولكن مراقب حتى لا تؤدي عند إغلاق الاستوديو. هل لديك أي فكرة عما أنا في عداد المفقودين هنا؟

وهذا نموذج التعليمات البرمجية (C #) يجب توضيح المشكلة:

FileSystemWatcher fileSystemWatcher = new FileSystemWatcher("C:\Test", "*.cs");
WaitForChangedResult changed = fileSystemWatcher.WaitForChanged(WatcherChangeTypes.All);
Console.Out.WriteLine(changed.Name);

ولقد وجدت بلوق وظيفة عن طريق Ayende أن يصف نفس المشكلة، ولكن للأسف لا يوجد حل.

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

المحلول

وكان هذا حقا مانع محيرة ... عندما كنت أجرب البرنامج المثال أدناه وتغيير الملف في VS، ستلاحظ الخطين في إطار الإخراج الخاص بك:

<اقتباس فقرة>   

محذوفة

     

وتسمية

والبصرية حتى ستوديو لا أبدا تغيير ملف موجود، فإنه يحفظ constents إلى ملف جديد باسم مؤقت، ثم حذف الملف الأصلي وإعادة تسمية الملف الجديد إلى الاسم القديم.

في الواقع، وهذا هو ممارسة جيدة، لأنه إذا كنت تفعل ذلك بالطريقة المعتادة (مجرد كتابة الملف تغييرها، والتي من شأنها أن تسبب حالة Changed أن يكون أطلق النار)، معالج الحدث يمكن أن يسمى قبل عملية الكتابة كاملة. إذا كان معالج الحدث بمعالجة محتويات الملف، وهذا قد يسبب مشاكل لأنها معالجة ملف غير مكتمل.

وبعبارة أخرى: <م> انها ليست علة، انها ميزة ؛ -)

    static class Program
    {
        [STAThread]
        static void Main()
        {
            FileSystemWatcher FSW = new FileSystemWatcher("c:\\", "*.cs");

            FswHandler Handler = new FswHandler();

            FSW.Changed += Handler.OnEvent;
            FSW.Created += Handler.OnEvent;
            FSW.Deleted += Handler.OnEvent;
            FSW.Renamed += Handler.OnEvent;

            FSW.EnableRaisingEvents = true;

            System.Threading.Thread.Sleep(555000);
            // change the file manually to see which events are fired

            FSW.EnableRaisingEvents = false;
        }
    }
    public class FswHandler
    {
        public void OnEvent(Object source, FileSystemEventArgs Args)
        {
            Console.Out.WriteLine(Args.ChangeType.ToString());
        }
    }
}

نصائح أخرى

وحلها عن طريق تحديد NotifyFilter الملكية:

FileSystemWatcher w = new FileSystemWatcher();           
w.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
| NotifyFilters.CreationTime;

وفقط لتوثيق هذا الاحتمال ...

MSDN :

<اقتباس فقرة>   

إذا عدة كائنات FileSystemWatcher يراقبون مسار UNC نفسه في نظام التشغيل Windows XP قبل إلى Service Pack 1 أو Windows 2000 SP2 أو في وقت سابق، ثم واحد فقط من الكائنات سترفع حدث. على أجهزة تشغيل SP1 ويندوز XP وأحدث، ويندوز 2000 SP3 أو أحدث أو Windows Server 2003، فإن جميع الأشياء FileSystemWatcher رفع الأحداث المناسبة.

وهكذا كانت فكرتي أن Visual ستوديو يحمل الخاصة FileSystemWatcher على ملف لأي سبب من الأسباب ... ولكن لم يكن لديك مسارات UNC ولا OS المذكورة.

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