इसी तरह की समस्या के साथ किसी और के लिए त्वरित टिप:
ड्रॉपबॉक्स जैसे वेब सिंक्रोनाइज़ेशन ऐप के लिए देखें। मैं सिर्फ 2 घंटे यह सोचकर बिताता हूं कि "स्टेटमेंट" (डिस्पोजल पैटर्न) का उपयोग .NET में टूट गया है।
मुझे अंततः एहसास हुआ कि ड्रॉपबॉक्स लगातार फ़ाइलों को पढ़ने और लिखने के लिए पृष्ठभूमि में है, ताकि उन्हें सिंक किया जा सके।
लगता है कि मेरा विज़ुअल स्टूडियो प्रोजेक्ट्स फ़ोल्डर कहाँ स्थित है? "माय ड्रॉपबॉक्स" फ़ोल्डर के अंदर।
इसलिए जैसा कि मैंने अपना आवेदन डिबग मोड में चलाया था, जिस फाइल को वह पढ़ रहा था और लिख रहा था, उसे भी ड्रॉपबॉक्स सर्वर के साथ सिंक करने के लिए लगातार ड्रॉपबॉक्स द्वारा एक्सेस किया जा रहा था। इसके कारण लॉकिंग / एक्सेस विरोध हुआ।
तो कम से कम मुझे अब पता है कि मुझे एक अधिक मजबूत फ़ाइल ओपन फ़ंक्शन (यानी ट्रायऑन () जो कई प्रयास करेगा) की आवश्यकता है। मुझे आश्चर्य है कि यह पहले से ही एक अंतर्निहित भाग नहीं है।
[अपडेट करें]
यहाँ मेरा सहायक कार्य है:
/// <summary>
/// Tries to open a file, with a user defined number of attempt and Sleep delay between attempts.
/// </summary>
/// <param name="filePath">The full file path to be opened</param>
/// <param name="fileMode">Required file mode enum value(see MSDN documentation)</param>
/// <param name="fileAccess">Required file access enum value(see MSDN documentation)</param>
/// <param name="fileShare">Required file share enum value(see MSDN documentation)</param>
/// <param name="maximumAttempts">The total number of attempts to make (multiply by attemptWaitMS for the maximum time the function with Try opening the file)</param>
/// <param name="attemptWaitMS">The delay in Milliseconds between each attempt.</param>
/// <returns>A valid FileStream object for the opened file, or null if the File could not be opened after the required attempts</returns>
public FileStream TryOpen(string filePath, FileMode fileMode, FileAccess fileAccess,FileShare fileShare,int maximumAttempts,int attemptWaitMS)
{
FileStream fs = null;
int attempts = 0;
// Loop allow multiple attempts
while (true)
{
try
{
fs = File.Open(filePath, fileMode, fileAccess, fileShare);
//If we get here, the File.Open succeeded, so break out of the loop and return the FileStream
break;
}
catch (IOException ioEx)
{
// IOExcception is thrown if the file is in use by another process.
// Check the numbere of attempts to ensure no infinite loop
attempts++;
if (attempts > maximumAttempts)
{
// Too many attempts,cannot Open File, break and return null
fs = null;
break;
}
else
{
// Sleep before making another attempt
Thread.Sleep(attemptWaitMS);
}
}
}
// Reutn the filestream, may be valid or null
return fs;
}