كيف يمكنني إجراء كتابة / إلحاق ذرية في C #، أو كيف أحصل على ملفات مفتوحة مع العلم file_append_data؟

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

  •  16-09-2019
  •  | 
  •  

سؤال

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

تدعم أنظمة تشغيل Windows نفس الوظيفة عن طريق المرور FILE_APPEND_DATA في المعلمة المناسبة إلى مكالمة نظام Win32 CreateFile ().

المراجع:

http://www.google.com/search?q=msdn+createfile
or: http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx

http://www.google.com/search?q=msdn+IoCreateFileSpecifyDeviceObjectHint
or: http://www.google.com/search?q=msdn+IoCreateFileSpecifyDeviceObjectHint

مشكلتي هي أن هذا، لا يمكنني تحديد كيفية الحصول على هذا السلوك ضمن C # باستخدام مكتبات صافي الإطار، هل هناك طريقة للحصول على هذا السلوك باستخدام إطار Net؟ أنا لا أصدق استخدام filemode.append يعطي هذا السلوك، بالمناسبة.

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

المحلول

استخدام واحدة من الزائد من FileStream البناء:

new FileStream(FileName, FileMode.Open, FileSystemRights.AppendData,
            FileShare.Write, 4096, FileOptions.None)

FileSystemRights.AppendData يتوافق مع FILE_APPEND_DATA

يبدو أن FileStream يصر على التخزين المؤقت، لذلك تأكد من أن المخزن المؤقت كبير بما يكفي لكل كتابة واتصال Flush() بعد كل كتابة.

مثال صغير:

    private void button1_Click(object sender, EventArgs e) {
        Thread t1 = new Thread(DoIt);
        Thread t2 = new Thread(DoIt);
        t1.Start("a");
        t2.Start("b");
        Thread.Sleep(2000);
        Environment.Exit(0);
    }

    private void DoIt(object p) {
        using (FileStream fs = new FileStream(FileName, FileMode.Open, FileSystemRights.AppendData,
            FileShare.Write, 4096, FileOptions.None)) {
            using (StreamWriter writer = new StreamWriter(fs)) {
                writer.AutoFlush = true;
                for (int i = 0; i < 20; ++i)
                    writer.WriteLine("{0}: {1:D3} {2:o} hello", p, i, DateTime.Now);
            }
        }
    }

نصائح أخرى

تستطيع الاتصال إنشاء ملف استخدام باتفوك مع المعلمات المطلوبة وتمرير المؤشر الناتج إلى واحد من منشئين fileestream التي تأخذ safefilehandle كمعلمة.

لماذا لا يمكنك استخدام

System.IO.File.AppendAllText("C:\\somefile.txt", "some content");

ب هذا مكالمة آمنة / "الذرية" أيضا.

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