سؤال

لدي خدمة Windows التي تكتب إدخالات ملف السجل إلى ملف سجل XML. أحتفظ بمقبض ملف السجل أثناء تشغيل الخدمة وإغلاقه وأدخله والتخلص منه عند إيقاف الخدمة. عمليات كتابة الملف هي من خلال الخدمة فقط ، ولدي فتح filestream في fileAccess.ReadWrite أثناء ضبط المشاركة على fileshare.read. أود أن أكون قادرًا على فتح هذا الملف وعرضه باستخدام مكالمة XMLRead () من خلال تطبيق آخر ، لكنني أحصل على خطأ يفيد بأن الملف يتم استخدامه بواسطة عملية أخرى. لقد قرأت منشورًا آخر حول هذا الأمر وكنت تحت انطباع أن هذا كان ممكنًا: موضوع آخر.

يتم مسح الكاتب قيد الاستخدام ، وإغلاقه ، والتخلص منه ، ويتم كتابة كل من FileStream. هل هذا غير ممكن في .NET ، أم أنني ربما فعلت شيئًا خاطئًا؟ يتبع نسخة قطع من الكود:

if (_logFS == null)
        _logFS = new FileStream(_fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);

if (!initFile)
{
    _logFS.Seek(-13, SeekOrigin.End);
}

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.OmitXmlDeclaration = true;
using (XmlWriter writer = XmlWriter.Create(_logFS, settings))
{
    if (initFile)
    {
        writer.WriteRaw("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n");
        writer.WriteStartElement("Entries", "http://www.abcdefg.com);
    }

    writer.WriteStartElement("Exception");
    // write out some stuff here.
    writer.WriteEndElement();


    writer.Flush();
    writer.Close();
}

_logFS.Flush();

رمز فتح الملف الآن كما يلي:

_LogDS = new XmlLogFile();
using (FileStream logFS = new FileStream(_fileName, FileMode.Open, FileAccess.Read)
{
    _LogDS.ReadXml(logFS);
}
هل كانت مفيدة؟

المحلول

تحتاج أيضا إلى إغلاق fileStream. على الأقل ، تحتاج إلى إغلاقه عندما تخرج خدمتك ، أو عندما يخرج Filestream من نطاق التطبيق.

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

في خدمتك ، تحتاج إلى تمكين مشاركة الملف:

FileStream fs = new FileStream("path", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);

وفي تطبيق القارئ:

FileStream fs = new FileStream("path", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

بدون ال FileShare.Read, ، جميع طلبات فتح الملف لفشل القراءة. سيظل أي تطبيق آخر يطلب فتح الملف للكتابة يفشل ، للمشاركة الممكّنة للكتابة التي تستخدمها FileShare.ReadWrite. الخيار الافتراضي ل FileShare هو None.

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