2009-09-16 12 views
16

लॉक करने के लिए कैसे कृपया मुझे बताओ सी # में फ़ाइल लॉक करने का तरीकाफ़ाइल

धन्यवाद

+0

इसका परिणाम कई अलग-अलग उत्तरों में हो सकता है, जो सभी मान्य होंगे। कृपया अधिक विशिष्टता जोड़ें। (बीटीडब्ल्यू, बस फाइल का चयन करने से कुछ अन्य लोगों को इसे एक्सेस करने से रोक दिया जा सकता है।) –

+7

कुंजी डालें, इसे बाईं ओर चालू करें। –

+0

यह मेरे लिए काम करता है http://stackoverflow.com/questions/4692981/c-sharp-blocking-a-folder-from-being-changed-while-processing/4693064#4693064 – Vbp

उत्तर

40

सीधे शब्दों में यह विशेष रूप से खोलें:

using (FileStream fs = 
     File.Open("MyFile.txt", FileMode.Open, FileAccess.Read, FileShare.None)) 
{ 
    // use fs 
} 

Ref

अद्यतन: जवाब में पोस्टर से टिप्पणी करने के लिए: ऑनलाइन MSDN doco के अनुसार, File.Open NET कम्पैक्ट फ्रेमवर्क 1.0 और 2.0 में समर्थित है।

+4

और जब आप इसमें हों, तो करें सुनिश्चित करें कि आप संदर्भ खोना नहीं चाहते हैं और जीसी गैर-निर्धारिती रूप से रिलीज़ होने तक अनलॉक करने में देरी करते हैं - उदाहरण के लिए उपरोक्त कथन को 'उपयोग' ब्लॉक में लपेटकर IDISposable इंटरफ़ेस का उपयोग करें। –

+1

यह सुनिश्चित नहीं है कि यह प्रश्न का उत्तर दे। ओपी FileStream.Lock विधि की तलाश में है, जो कॉम्पैक्ट फ्रेमवर्क में मौजूद नहीं है। लॉक अन्य प्रक्रियाओं को फ़ाइल को संशोधित करने से रोकता है, लेकिन फिर भी उन्हें इसे पढ़ने देता है। मुझे लगता है कि आपकी विधि पूरी तरह से अन्य प्रक्रियाओं को अवरुद्ध करेगी। – MusiGenesis

+0

@MusiGenesis: पोस्टर पूछता है कि फ़ाइल को लॉक कैसे करें ... –

0

यह मिच के उत्तर के बराबर है, सिवाय इसके कि यह नेट के अधिक संस्करणों में उपलब्ध है। एकमात्र महत्वपूर्ण तर्क FileShare.None है; अन्य लोग कन्स्ट्रक्टर के अधिभार को सक्षम करते हैं, लेकिन उनके मान इस बात से निर्धारित होते हैं कि आप स्ट्रीम का उपयोग कैसे करेंगे।

using(var fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None) 
{ 
    // ... 
} 
0

फाइलशेयर। अगर कोई अन्य थ्रेड फ़ाइल तक पहुंचने का प्रयास कर रहा है तो कोई "System.IO.IOException" त्रुटि फेंक देगा।

आप फ़ाइल को रिलीज़ होने के लिए प्रतीक्षा करने के लिए प्रयास/पकड़ का उपयोग करके कुछ फ़ंक्शन का उपयोग कर सकते हैं। उदाहरण here

या आप लिखने समारोह तक पहुँचने से पहले कुछ "डमी" चर के साथ एक ताला बयान इस्तेमाल कर सकते हैं:

// The Dummy Lock 
    public static List<int> DummyLock = new List<int>(); 

    static void Main(string[] args) 
    { 
     MultipleFileWriting(); 
     Console.ReadLine(); 
    } 

    // Create two threads 
    private static void MultipleFileWriting() 
    { 
     BackgroundWorker thread1 = new BackgroundWorker(); 
     BackgroundWorker thread2 = new BackgroundWorker(); 
     thread1.DoWork += Thread1_DoWork; 
     thread2.DoWork += Thread2_DoWork; 
     thread1.RunWorkerAsync(); 
     thread2.RunWorkerAsync(); 
    } 

    // Thread 1 writes to file (and also to console) 
    private static void Thread1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     for (int i = 0; i < 20; i++) 
     { 
      lock (DummyLock) 
      { 
       Console.WriteLine(DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss") + " - 3"); 
       AddLog(1); 
      } 
     } 
    } 

    // Thread 2 writes to file (and also to console) 
    private static void Thread2_DoWork(object sender, DoWorkEventArgs e) 
    { 
     for (int i = 0; i < 20; i++) 
     { 
      lock (DummyLock) 
      { 
       Console.WriteLine(DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss") + " - 4"); 
       AddLog(2); 
      } 
     } 
    } 

    private static void AddLog(int num) 
    { 
     string logFile = Path.Combine(Environment.CurrentDirectory, "Log.txt"); 
     string timestamp = DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss"); 

     using (FileStream fs = new FileStream(logFile, FileMode.Append, 
      FileAccess.Write, FileShare.None)) 
     { 
      using (StreamWriter sr = new StreamWriter(fs)) 
      { 
       sr.WriteLine(timestamp + ": " + num); 
      } 
     } 

    } 

तुम भी वास्तविक लेखन समारोह अपने आप में बयान "ताला" का उपयोग कर सकते (यानी AddLog अंदर) पृष्ठभूमि कार्यकर्ता के कार्यों के बजाय।