هل يمكنني منع StreamReader من قفل ملف نصي أثناء استخدامه؟

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

سؤال

يقوم StreamReader بتأمين الملف النصي أثناء قراءته.
هل يمكنني إجبار StreamReader على العمل في وضع "للقراءة فقط" أو "غير قابل للقفل"؟

سيكون الحل البديل هو نسخ الملف إلى موقع مؤقت وقراءته من هناك ولكني أفضل استخدام StreamReader مباشرة إن أمكن.هل هناك أي اقتراحات بديلة؟

خلفية:
لقد كتبت تطبيقًا صغيرًا للحصول على بعض الإحصائيات من ملف السجل.يتم تحديث هذا الملف باستمرار (عدة مرات في الثانية) بواسطة برنامج خارجي يتيح الاتصال بـ AAXXYY.

تشير مراجعة الإخراج إلى أن تطبيقي ربما يقوم بقفل الملف ويمنع AAXXYY من الكتابة.

هذا ما أفعله

    private void btnGetStats_Click(object sender, EventArgs e)
    {
        int countStarts = 0;
        int countEnds = 0;

        IList<string> sessions = new List<string>();

        using(StreamReader stRead = new StreamReader(openFileDialog1.FileName,Encoding.Unicode))
        {
            while(!stRead.EndOfStream)
            {
                string line = stRead.ReadLine();
                if(line.Contains("Session start"))
                {
                    countStarts++;
                    sessions.Add(line.Substring(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("[")));
                }
                if (line.Contains("Session end"))
                {
                    countEnds++;
                    sessions.Remove(line.Substring(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("[")));
                }
            }
        }

        txtStarts.Text = countStarts.ToString();
        txtEnds.Text = countEnds.ToString();
        txtDifference.Text = (countStarts - countEnds).ToString();

        listBox1.DataSource = sessions;
    }
هل كانت مفيدة؟

المحلول

ويمكنك تمرير يقوم FileStream إلى StreamReader، وخلق يقوم FileStream مع القيمة FileShare المناسبة. على سبيل المثال:

using (var file = new FileStream (openFileDialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var reader = new StreamReader (file, Encoding.Unicode)) {
}

نصائح أخرى

اعتقدت أنني سأضيف بعض السياق، StreamReader لا قفل ملف للقراءة فقط للكتابة صه يتم قراءتها.ألق نظرة على الكود أدناه من فئة StreamReader.

 new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, FileOptions.SequentialScan);

لاحظ المعلمة FileAccess.Read الافتراضية التي تم التقاطها لـ MSDN http://msdn.microsoft.com/en-us/library/system.io.filesare.aspx

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

مرة أخرى مأخوذ من MSDN للسماح بالقراءة والكتابة، استخدم FileAccess.ReadWrite بدلاً من ذلك (كما اقترح Jb Evain).

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

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