وجود مشكلة في فتح/الكتابة إلى ملف نصي في ASP.NET

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

  •  11-07-2019
  •  | 
  •  

سؤال

أريد أن أكتب بعض الإحصائيات إلى ملف نصي في كل مرة شخص يقوم بتحميل الصفحة.ولكن كل مرة واحدة في لحظة أنا على الحصول على 'لا يمكن فتح الملف بالفعل في استخدام' نوع من الخطأ.أنا لا يمكن أن 100% تكرار هذا الخطأ هو خاطئ جدا.بلدي رمز

Public Sub WriteStats(ByVal ad_id As Integer)
    Dim ad_date As String = Now.Year & Now.Month

    Dim FILENAME As String = Server.MapPath("text/BoxedAds.txt")
    Dim objStreamWriter As StreamWriter
    objStreamWriter = File.AppendText(FILENAME)
    objStreamWriter.WriteLine(ad_id & ";" & ad_date)
    objStreamWriter.Close()
End Sub

سؤالي هو كيف يمكنني قفل وفتح الملف لذا توقفت عن الحصول على انتظام الأخطاء ؟

شكرا

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

المحلول

وسيكون لديك للتعامل مع استثناء وبناء بعض مناولة لإعادة محاكمة الكتابة إلى الملف بعد فاصل زمني عشوائي القصير.

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

نصائح أخرى

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

Public Sub WriteStats(ByVal ad_id As Integer)
    Dim ad_date As String = Now.Year & Now.Month
    Dim FILENAME As String = Server.MapPath("text/BoxedAds.txt")
    Dim index As Integer

    Using fs As New IO.FileStream(FILENAME, IO.FileMode.Append, IO.FileAccess.Write, IO.FileShare.ReadWrite), _
          tl As New TextWriterTraceListener(fs)

        index = Trace.Listeners.Add(tl)
        Trace.WriteLine(ad_id & ";" & ad_date)
        Trace.Listeners(index).Flush()
        Trace.Flush()
    End Using
    Trace.Listeners.RemoveAt(index)
End Sub

ثلاثة أشياء مهمة هنا:

  1. استخدام IO.FileShare.ReadWrite أن تسمح متعددة من الكتاب على ملف في وقت واحد.
  2. العبارة باستخدام للتأكد من تيار أغلقت على الفور ، حتى لو حدوث استثناء.هذا سوف تقليل التصادم
  3. على TextWriterTraceListener سيتم إنشاء ملف temp الخاص بك إذا كان لا يمكن فتح الملف الذي طلب للتأكد من أن الرسالة لم يفقد.

ولم تتح لي أي مشكلة مع معلومات قصيرة باستخدام: File.AppendAllText (مسار، المعلومات)؛

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

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

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