قراءة التغييرات في الملف في الوقت الحقيقي باستخدام .صافي

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

  •  01-07-2019
  •  | 
  •  

سؤال

لدي .ملف csv التي يتم تحديثها بشكل متكرر (حوالي 20 إلى 30 مرة في الدقيقة الواحدة).أريد أن أدخل حديثا خطوط إضافتها إلى قاعدة البيانات في أقرب وقت كما هي مكتوبة إلى ملف.

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

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

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

المحلول

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

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

ملاحظة:كما سبق ذكره, هذا سوف تعمل فقط إذا كانت التعديلات دائما الإضافات إلى الملف.أي الحذف سوف يسبب مشاكل.

ويساعد هذا الأمل.

   public void File_Changed( object source, FileSystemEventArgs e )
    {
        lock ( this )
        {
            if ( !this.bPaused )
            {
                bool bMoreData = false;

                // Read from current seek position to end of file
                byte[] bytesRead = new byte[this.iMaxBytes];
                FileStream fs = new FileStream( this.strFilename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite );

                if ( 0 == this.iPreviousSeekPos )
                {
                    if ( this.bReadFromStart )
                    {
                        if ( null != this.BeginReadStart )
                        {
                            this.BeginReadStart( null, null );
                        }
                        this.bReadingFromStart = true;
                    }
                    else
                    {
                        if ( fs.Length > this.iMaxBytes )
                        {
                            this.iPreviousSeekPos = fs.Length - this.iMaxBytes;
                        }
                    }
                }

                this.iPreviousSeekPos = (int)fs.Seek( this.iPreviousSeekPos, SeekOrigin.Begin );
                int iNumBytes = fs.Read( bytesRead, 0, this.iMaxBytes );
                this.iPreviousSeekPos += iNumBytes;

                // If we haven't read all the data, then raise another event
                if ( this.iPreviousSeekPos < fs.Length )
                {
                    bMoreData = true;
                }

                fs.Close();

                string strData = this.encoding.GetString( bytesRead );
                this.MoreData( this, strData );

                if ( bMoreData )
                {
                    File_Changed( null, null );
                }
                else
                {
                    if ( this.bReadingFromStart )
                    {
                        this.bReadingFromStart = false;
                        if ( null != this.EndReadStart )
                        {
                            this.EndReadStart( null, null );
                        }
                    }
                }
            }
        }

نصائح أخرى

صحيح فيليسيستيمواتشير لا يعرف أي شيء عن محتويات الملف.أنه سوف أقول لكم إذا تغيرت ، إلخ.ولكن ليس ما تغيرت.

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

أعتقد أن عليك استخدام NTFS تغيير مجلة أو ما شابه:

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

يمكنك العثور على الوصف على TechNet.سوف تحتاج إلى استخدام PInvoke في .صافي.

وأود أن الحفاظ على النص الحالي في الذاكرة إذا كانت صغيرة بما فيه الكفاية ثم استخدام مهرجان دبي السينمائي الدولي خوارزمية للتحقق مما إذا كان النص الجديد النص السابق تغيرت.هذه المكتبة ، http://www.mathertel.de/Diff/, ليس فقط سوف أقول لكم أن شيئا ما تغير لكن ما تغيرت كذلك.حتى تتمكن من ثم إدراج البيانات التي تم تغييرها في ديسيبل.

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

ثم يسعى القارئ إلى آخر حجم الملف و تبدأ القراءة من هناك.

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

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

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