سؤال

لدي ملف يحتوي على بيانات أود مراقبة التغييرات إليها ، وكذلك إضافة تغييرات خاصة بي. فكر مثل "ذيل -f foo.txt".

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

أعلم أن الأمر يبدو وكأنه موقف غريب ... إنه تجربة أكثر لمعرفة ما إذا كان يمكن القيام به.

فيما يلي الحالة التي جربتها:


foo.txt:
أ
ب
ج
د
ه
F


        string test = "foo.txt";
        System.IO.FileStream fs = new System.IO.FileStream(test, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite);

        var sw = new System.IO.StreamWriter(fs);
        var sr = new System.IO.StreamReader(fs);

        var res = sr.ReadLine();
        res = sr.ReadLine();
        sw.WriteLine("g");
        sw.Flush();
        res = sr.ReadLine();
        res = sr.ReadLine();
        sw.WriteLine("h");
        sw.Flush();
        sw.WriteLine("i");
        sw.Flush();
        sw.WriteLine("j");
        sw.Flush();
        sw.WriteLine("k");
        sw.Flush();
        res = sr.ReadLine();
        res = sr.ReadLine();
        res = sr.ReadLine();
        res = sr.ReadLine();
        res = sr.ReadLine();
        res = sr.ReadLine();

بعد تجاوز "F" ، يعود القارئ الخالية.

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

المحلول

طيب ، اثنين من التعديلات في وقت لاحق ...

هذا يجب أن يعمل. في المرة الأولى التي جربتها ، أعتقد أنني نسيت تعيين fileMode.append على Ostream.

string test = "foo.txt";

var oStream = new FileStream(test, FileMode.Append, FileAccess.Write, FileShare.Read); 
var iStream = new FileStream(test, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 

var sw = new System.IO.StreamWriter(oStream);
var sr = new System.IO.StreamReader(iStream); 
var res = sr.ReadLine(); 
res = sr.ReadLine();
sw.WriteLine("g"); 
sw.Flush(); 
res = sr.ReadLine();
res = sr.ReadLine();
sw.WriteLine("h"); sw.Flush();
sw.WriteLine("i"); sw.Flush(); 
sw.WriteLine("j"); sw.Flush(); 
sw.WriteLine("k"); sw.Flush(); 
res = sr.ReadLine(); 
res = sr.ReadLine(); 
res = sr.ReadLine();
res = sr.ReadLine();
res = sr.ReadLine();
res = sr.ReadLine();

نصائح أخرى

Mikerobi صحيح ، عندما تكتب إلى دفق ، يتم تغيير مؤشر الملف ونقله إلى نهاية الدفق. ما لا تعتمد عليه هو أن StreamReader لديه المخزن المؤقت الخاص به. يقرأ 1024 بايت من الملف وستحصل على نتائج من هذا المخزن المؤقت. حتى ينفد المخزن المؤقت بحيث يتعين عليه القراءة من filestream مرة أخرى. لا شيء لأن مؤشر الملف هو في نهاية الملف.

تحتاج حقًا إلى فصل filestreams ، ولكل منها مؤشر ملف خاص بها أي أمل في القيام بهذا العمل.

أعتقد أنه في كل مرة تكتب فيها شخصية ، فإنك تتقدم إلى وضع الدفق ، لذلك فإن المحاولات القادمة التالية للقراءة بعد الشخصية التي كتبتها للتو. يحدث هذا لأن قارئ الدفق وكاتب الدفق يستخدمون نفس Filestream. استخدم Filestream مختلفًا ، أو اطلب من أحرف -1 في الدفق بعد كل كتابة.

من غير المرجح أن تكون سعيدًا بأي حل لهذه المشكلة يتضمن استخدام نفس الدفق للقراءة والكتابة. هذا صحيح بشكل خاص إذا كنت تحاول قراءة ذيل الملف باستخدام أ StreamReader.

تريد أن يكون لديك تدفقات ملفات مختلفة. يمكن أن يكون دفق الكتابة StreamWriter إذا تحب. يجب أن يكون دفق القراءة دفقًا ثنائيًا (أي إنشاء مع File.OpenRead أو FileStream.Create) ، اقرأ البايتات الخام من الملف ، وتحويلها إلى نص. جوابي على هذا السؤال يظهر أساسيات كيف يتم ذلك.

إذا قمت بإضافة مكالمة إلى StreamReader.DiscardBufferedData(), ، هل هذا يغير السلوك؟

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