كيفية الانتظار أفضل لfilelock لاطلاق سراح
-
22-08-2019 - |
المحلول
عند فتح ملف للقراءة في. NET سيكون في مرحلة ما محاولة إنشاء مؤشر ملف باستخدام في CreateFile وظيفة API التي تحدد في رمز الخطأ والتي يمكن استخدامها لمعرفة سبب فشل:
const int ERROR_SHARING_VIOLATION = 32;
try
{
using (var stream = new FileStream("test.dat", FileMode.Open, FileAccess.Read, FileShare.Read))
{
}
}
catch (IOException ex)
{
if (Marshal.GetLastWin32Error() == ERROR_SHARING_VIOLATION)
{
Console.WriteLine("The process cannot access the file because it is being used by another process.");
}
}
نصائح أخرى
وهناك مناقشة مفيدة على مجموعة جوجل التي كنت حقا يجب أن يقرأ. أحد الخيارات بالقرب من دارين. ومع ذلك، لضمان أن تحصل على خطأ Win32 الصحيح، هل حقا يجب استدعاء OpenFile Win32 و() API نفسك (وإلا، هل حقا لا أعرف أي خطأ يتم استرداد).
وآخر هو تحليل رسالة الخطأ: التي سوف تفشل إذا تم تشغيل التطبيق الخاص بك على نسخة لغة أخرى
.وثمة خيار ثالث هو الإختراق داخل الطبقة استثناء مع انعكاس لصيد السمك خارج HRESULT الفعلي.
وأي من البدائل حقا أن جذاب: إن التسلسل الهرمي IOException تستفيد من عدد قليل من أكثر الفئات الفرعية IMHO.
لقراءة البيانات التي يمكنك القيام بها:
<اقتباس فقرة>وباستخدام (يقوم FileStream خ = جديد يقوم FileStream (اسم الملف، FileMode.Open، FileAccess.Read، FileShare.ReadWrite | FileShare.Delete)) {....}
اقتباس فقرة>ووحفظ في ملف:
<اقتباس فقرة>وباستخدام (يقوم FileStream خ = جديد يقوم FileStream (اسم الملف، FileMode.Append، FileAccess.Write، FileShare.Read | FileShare.Delete)) {...}
اقتباس فقرة>وأعلام في نهاية الصانعين يصف ما يمكن أن يفعله عملية أخرى مع الملف. انها على ما يرام، وبطبيعة الحال، إذا كنت السيطرة على كل كتابة وقراءة ...
ويمكنك فتحه (كما وصفها bezieur) ثم محاولة قفل أبواب (أو ملف كامل): http://www.java2s.com/Code/VB/File- الدليل / Lockandunlockafile.htm
هل يعني انك القراءة والكتابة إلى ملف على حد سواء؟ أو أن تطبيق خارجي هو الكتابة إليها.
إذا كنت تفعل القراءة والكتابة ثم أفترض كنت أفعل ذلك في المواضيع المختلفة في هذه الحالة نلقي نظرة على الطبقة ReaderWriteLock التي سوف تفعل هذه الإدارة بالنسبة لك، وتسمح لك لتوفير مهلة.
http://msdn.microsoft.com/en -US / مكتبة / system.threading.readerwriterlock.aspx
وإلا كل ما عليك القيام به هو فتح الملف في وضع للقراءة فقط. ثم يجب أن لا يكون لديك أي مشاكل:
fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read));
ويمكنك مقارنة ضد نوع IOException لفحص ومعرفة ما اذا كان هو لا شيء آخر
ومثل
if (ex is FileNotFoundException)
وربما تريد للبحث عن مساعدة فى System.IO. وهناك الكثير من الاستثناءات في هذا ترث الفئة من IOException أ >. خارج فحص لمعرفة ما اذا كان هو نوع آخر من الاستثناء قد تضطر للنظر في رسالة من الوصف أو قد نظر في إجراء مكالمة API Win32 وفي SHELL32.DLL. قد تكون هناك وظيفة في وجود لمعرفة ما اذا كان تم تأمين الملف.
وأيضا، إذا كنت في حاجة على الإطلاق إلى الانتظار يمكنك استخدام حلقة، ولكن إذا كنت تريد أن تفعل إجراءات أخرى في الوقت الذي تنتظر استخدام موضوع غير متزامن.