كيف يمكنني إجراء كتابة / إلحاق ذرية في C #، أو كيف أحصل على ملفات مفتوحة مع العلم file_append_data؟
سؤال
ضمن معظم 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");
ب هذا مكالمة آمنة / "الذرية" أيضا.