2009-09-16 18 views
16

la prego di dirmi come bloccare file in C#Come bloccare il file

Grazie

+0

Ciò potrebbe comportare dozzine di risposte diverse, che sarebbero tutte valide. Si prega di aggiungere ulteriori dettagli. (A proposito, solo l'opinione del file potrebbe già impedire a molti altri di accedervi.) –

+7

Inserisci la chiave, girala a sinistra. –

+0

Questo ha funzionato per me http://stackoverflow.com/questions/4692981/c-sharp-blocking-a-folder-from-being-changed-while-processing/4693064#4693064 – Vbp

risposta

40

Basta aprirlo esclusivamente:

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

Ref.

Aggiornamento: In risposta al commento del poster: Secondo l'online MSDN doco, File.Open è supportato in. Net Compact Framework 1.0 e 2.0.

+4

E mentre ci sei, fai sicuro di non perdere il riferimento e ritardare lo sblocco finché il GC non lo rilasci in modo non deterministico - usa l'interfaccia IDisposable, ad esempio avvolgendo l'affermazione precedente in un blocco 'using'. –

+1

Non sicuro che questo risponda alla domanda. OP sta cercando il metodo FileStream.Lock, che non esiste nel framework compatto. Blocca impedisce ad altri processi di modificare il file, ma continua a consentirgli di leggerlo. Penso che il tuo metodo bloccherebbe completamente altri processi. – MusiGenesis

+0

@MusiGenesis: Il poster sembra chiedere come bloccare un file ... –

0

Questo equivale alla risposta di Mitch, tranne che sembra essere disponibile in più versioni di .Net. L'unico argomento significativo è FileShare.None; gli altri abilitano quel sovraccarico del costruttore, ma i loro valori sono determinati da come userete il flusso.

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

FileShare.NONE sarebbe lanciare un errore "System.IO.IOException" se un altro thread tenta di accedere al file.

È possibile utilizzare alcune funzioni utilizzando try/catch per attendere il rilascio del file. Esempio here.

Oppure si potrebbe usare una dichiarazione di blocco con qualche variabile "fittizio" prima di accedere alla funzione di scrittura:

// 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); 
      } 
     } 

    } 

È anche possibile utilizzare il "Lock" dichiarazione nella funzione attuale scrittura stessa (cioè all'interno AddLog) invece che in background le funzioni del lavoratore.

Problemi correlati