سؤال

ولدي التطبيق حيث كنت في بعض الأحيان تحتاج إلى قراءة من ملف يتم كتابتها إلى ونتيجة لحبسهم. وكما يفهم من أنني يجب أن قبض على IOException وإعادة المحاولة حتى أستطيع القراءة.

ولكن سؤالي هو: كيف لي أن أعرف على وجه اليقين أن يتم تأمين الملف وأنه ليس IOExcetpion آخر أن يحدث.

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

المحلول

عند فتح ملف للقراءة في. 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));
scroll top