سؤال

لا تحتاج إلى إعداد تطبيق الساعات عن الملفات التي يتم إنشاؤها في الدليل ، سواء محليا أو على محرك أقراص شبكة اتصال.

هل FileSystemWatcher أو الاقتراع على الموقت سيكون الخيار الأفضل.لقد استخدمت كل الأساليب في الماضي ، ولكن ليس على نطاق واسع.

ما هي القضايا (الأداء والاعتمادية.... الخ) هل هناك أي طريقة ؟

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

المحلول

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

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

نصائح أخرى

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

هنا المقالة MSDN على العازلة :فيليسيستيمواتشير..::.InternalBufferSize الملكية

في MSDN:

زيادة حجم المخزن المؤقت غير مكلفة ، كما أنه يأتي من غير المقسمة إلى صفحات الذاكرة التي لا يمكن تبديل الخروج إلى القرص ، حتى تبقى العازلة صغيرة قدر الإمكان.لتجنب تجاوز سعة المخزن المؤقت ، استخدم NotifyFilter و IncludeSubdirectories خصائص لتصفية غير المرغوب فيها تغيير الإخطارات.

نحن نستخدم 16MB بسبب دفعة كبيرة المتوقع في وقت واحد.يعمل بشكل جيد و لم يخطئ ملف.

نحن أيضا قراءة جميع الملفات قبل بداية العملية حتى واحد...الحصول على أسماء الملفات بأمان مؤقتا بعيدا (في حالتنا في جدول قاعدة بيانات) ثم عملية لهم.

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

ووFileSystemWatcher يمكن أيضا يغيب عن التغييرات خلال أوقات الذروة، وإذا كان عدد من التغييرات في قائمة الانتظار تجاوزات المخزن المؤقت المقدمة. هذا ليس وجود قيود على فئة. NET في حد ذاته، ولكن البنية التحتية Win32 والأساسية. في تجربتنا، فإن أفضل طريقة للحد من هذه المشكلة هو dequeue الإخطارات بأسرع وقت ممكن، والتعامل معها على موضوع آخر.

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

وأوافق على أن حلا وسطا جيدا هو أن تفعل استطلاع عرضية لالتقاط أية تغييرات لم يرد عليها.

ونلاحظ أيضا أن مراقب نظام الملفات لا يمكن الاعتماد على مشاركات الملفات. خاصة إذا تمت استضافة مشاركة الملفات على الخادم غير ويندوز. FSW لا ينبغي أن تستخدم لشيء بالغ الأهمية. أو ينبغي أن تستخدم مع استطلاع عرضية للتحقق من أنه لم غاب أي شيء.

وشخصيا، لقد استعملت FileSystemWatcher على نظام الإنتاج، وأنها عملت بشكل جيد. في ال 6 أشهر الماضية، لم يكن ذلك زوبعة واحدة تشغيل 24/7. انها تراقب مجلد محلي واحد (والذي هو مشترك). لدينا عدد قليل نسبيا من عمليات الملفات التي لديها للتعامل مع (10 الأحداث أطلقت يوميا). انها ليست شيئا واجهني ما يدعو للقلق. فما استقاموا لكم فاستقيموا استخدامه مرة أخرى إذا اضطررت إلى إعادة صياغة القرار.

أنا حاليا استخدم FileSystemWatcher على ملف XML يتم تحديثه في المتوسط كل 100 مللي ثانية.

لقد وجدت أنه طالما FileSystemWatcher تم تكوينه بشكل صحيح يجب أن لا يكون لديك مشاكل مع المحلية ملفات.

ليس لدي أي خبرة في الملفات عن بعد ومشاهدة ويندوز غير سهم.

وأود أن تنظر الاقتراع الملف أن تكون زائدة لا تساوي النفقات العامة إلا إذا كنت بطبيعتها عدم الثقة FileSystemWatcher أو مباشرة من ذوي الخبرة القيود الجميع هنا المدرجة (غير ويندوز سهم ، بعد مشاهدة الملف).

وكنت اذهب مع الاقتراع.

والقضايا الشبكة تسبب FileSystemWatcher لا يمكن الاعتماد عليها (حتى عندما إثقال حدث خطأ).

ولقد واجهت مشكلة في استخدام FileSystemWatcher على شبكة سهم. إذا كنت في بيئة ويندوز نقية، فإنه قد لا يكون مشكلة، ولكن كنت أشاهد حصة NFS ومنذ NFS عديم الجنسية، لم يكن هناك إعلام عند ملف أشاهد تغيرت I.

وكان لي بعض مشاكل كبيرة مع FSW على محركات أقراص الشبكة: حذف ملف رمى دائما حالة الخطأ، أبدا الحدث حذفها. لم أجد حلا، لذلك أنا الآن تجنب FSW واستخدام الاقتراع.

عملت

والأحداث الخلق من ناحية أخرى ما يرام، حتى إذا كنت بحاجة فقط لمشاهدة لإنشاء الملف، يمكنك الذهاب للFSW.

وأيضا، لم يكن لدي أي مشاكل على الاطلاق على المجلدات المحلية، لا يهم إذا المشتركة أم لا.

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

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

تحرير :nmclean's نقطة صلاحية استخدام كل FSW الاقتراع(يمكنك قراءة النقاش في التعليقات إذا كنت مهتما) يبدو منطقي جدا تفسير لماذا يمكن أن يكون هناك حالات استخدام كل FSW الاقتراع هو كفاءة.شكرا لكم على تسليط الضوء على هذا بالنسبة لي(و أي شخص آخر على نفس الرأي) ، nmclean.

والعودة من الأسلوب الحدث في أسرع وقت ممكن، وذلك باستخدام موضوع آخر، تحل مشكلة بالنسبة لي:

private void Watcher_Created(object sender, FileSystemEventArgs e)
{
    Task.Run(() => MySubmit(e.FullPath));
}

يعمل حل من أجل العمل مع إنشاء الحدث بدلا من تغيير

حتى نسخ, قص, لصق, الخطوة.

class Program
{        

        static void Main(string[] args)
        {
            string SourceFolderPath = "D:\\SourcePath";
            string DestinationFolderPath = "D:\\DestinationPath";
            FileSystemWatcher FileSystemWatcher = new FileSystemWatcher();
            FileSystemWatcher.Path = SourceFolderPath;
            FileSystemWatcher.IncludeSubdirectories = false;
            FileSystemWatcher.NotifyFilter = NotifyFilters.FileName;   // ON FILE NAME FILTER       
            FileSystemWatcher.Filter = "*.txt";         
             FileSystemWatcher.Created +=FileSystemWatcher_Created; // TRIGGERED ONLY FOR FILE GOT CREATED  BY COPY, CUT PASTE, MOVE  
            FileSystemWatcher.EnableRaisingEvents = true;

            Console.Read();
        }     

        static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)
        {           
                string SourceFolderPath = "D:\\SourcePath";
                string DestinationFolderPath = "D:\\DestinationPath";

                try
                {
                    // DO SOMETING LIKE MOVE, COPY, ETC
                    File.Copy(e.FullPath, DestinationFolderPath + @"\" + e.Name);
                }
                catch
                {
                }          
        }
}

حل هذا الملف مراقب في حين سمة ملف تغيير الحدث باستخدام ثابت التخزين

class Program
{
    static string IsSameFile = string.Empty;  // USE STATIC FOR TRACKING

    static void Main(string[] args)
    {
         string SourceFolderPath = "D:\\SourcePath";
        string DestinationFolderPath = "D:\\DestinationPath";
        FileSystemWatcher FileSystemWatcher = new FileSystemWatcher();
        FileSystemWatcher.Path = SourceFolderPath;
        FileSystemWatcher.IncludeSubdirectories = false;
        FileSystemWatcher.NotifyFilter = NotifyFilters.LastWrite;          
        FileSystemWatcher.Filter = "*.txt";         
        FileSystemWatcher.Changed += FileSystemWatcher_Changed;
        FileSystemWatcher.EnableRaisingEvents = true;

        Console.Read();
    }     

    static void FileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
    {
        if (e.Name == IsSameFile)  //SKIPS ON MULTIPLE TRIGGERS
        {
            return;
        }
        else
        {
            string SourceFolderPath = "D:\\SourcePath";
            string DestinationFolderPath = "D:\\DestinationPath";

            try
            {
                // DO SOMETING LIKE MOVE, COPY, ETC
                File.Copy(e.FullPath, DestinationFolderPath + @"\" + e.Name);
            }
            catch
            {
            }
        }
        IsSameFile = e.Name;
    }
}

هذا هو الحل الحل لهذه المشكلة من عدة اثار الحدث.

وأود أن أقول استخدام الاقتراع، وخاصة في سيناريو TDD، كما أنه من الأسهل بكثير للسخرية / كعب وجود ملفات أو عندما يتم تشغيل الحدث الاقتراع من الاعتماد على أكثر من "غير المنضبط" الحدث FSW. + لذلك بعد أن عملت في عدد من التطبيقات التي تعاني من أخطاء FSW.

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