2012-07-03 30 views
12

जो मैं करने का प्रयास कर रहा हूं वह है कि मेरा प्रोग्राम फ़ाइल का उपयोग कर रहा है, मैं उपयोगकर्ता को फ़ाइल को नाम बदलने, हटाने या स्थानांतरित करने के लिए रखना चाहता हूं (ठीक है ... a विंडोज FileSystemWatcher के अनुसार चाल एक अलग स्थान पर एक डिलीट और एक निर्माण है, लेकिन मैं digress)।किसी उपयोगकर्ता को फ़ाइल को हटाने, स्थानांतरित करने या नाम बदलने से रोकें

यह सुझाव दिया गया है कि मैं FileStream.Lock का उपयोग करता हूं या Mutex का उपयोग करता हूं। हालांकि, FileStream.Lock केवल फ़ाइल को संशोधित करने से रोकने के लिए प्रतीत होता है जिसे मैं को अनुमति देने का प्रयास कर रहा हूं। साथ ही, मुझे बहुत यकीन नहीं है कि एक म्यूटेक्स फ़ाइल को लॉक कर सकता है, हालांकि मैं अभी भी नेट 4.0 लाइब्रेरी में इसे पढ़ रहा हूं।

क्या किसी को भी किसी का उपयोग करने पर कोई सलाह है और यदि इस समस्या का कोड आधारित समाधान है?

+0

यह एक बहुत ही असामान्य यूज-केस की तरह लगता है। मैं उत्सुक हूं कि आपने इस स्थिति में खुद को कैसे पाया है ... क्या आप आगे की व्याख्या करने की परवाह करते हैं? शायद एक वास्तुकला समाधान है। – JDB

उत्तर

19

जब आप फ़ाइल खोल रहे हैं, तो आप साझाकरण मोड निर्दिष्ट कर सकते हैं।

FileAccess.Read के साथ फ़ाइल खोलने से आपको फ़ाइल पढ़ने की क्षमता मिलती है, जबकि FileShare.ReadWrite फ़ाइल को संपादित करना जारी रखने की अनुमति देता है, लेकिन हटाया या स्थानांतरित नहीं किया जाता है।

var fs = File.Open(@"C:\temp\file.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
MessageBox.Show("File Locked"); // While the messagebox is up, try to open or delete the file. 
// Do your work here 
fs.Close(); 
+0

वाह, यह फ़ाइल नामों को भी रोकता है। इसके लिए धन्यवाद, यह मेरे विचार से बेहतर काम करेगा, क्योंकि यह माइक्रोसॉफ्ट बॉक्स को भी फेंकता है: डी –

3

यह जाने या फ़ाइल को हटाने कर पाएगा लेकिन पढ़ की अनुमति देता है और लिखें:

using (FileStream fs = new FileStream(@"C:\TestDir\Test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
    { 
     // Do Stuff. 
    } 

FileStream.Lock वास्तव में एक सीमा ताला, जिसके कारण फ़ाइल की एक विशेष भाग के संशोधन से बचाता है, जबकि ताला है का आयोजन किया।

+1

+1 पहला सही उत्तर। – JDB

+0

एफटीआर @ जॉन कॉर्नर ने इसे 3 मिनट पहले हल किया। –

0

तुम सब कुछ लॉक करने के लिए चाहते हैं (, पढ़ने के लिए न न लिखना, हटाने, न चाल न, ...)
खुला एक StreamWriter

StreamWriter sw = new StreamWriter(path);