2009-09-16 9 views
16

por favor, dígame cómo bloquear archivos en C#Cómo bloquear archivo

Gracias

+0

Esto podría dar lugar a docenas de respuestas diferentes, que serían todas válidas. Por favor agregue más detalles. (Por cierto, simplemente opinando que el archivo ya podría bloquear el acceso de muchos otros). –

+7

Inserte la clave, gírela hacia la izquierda. –

+0

Esto funcionó para mí http://stackoverflow.com/questions/4692981/c-sharp-blocking-a-folder-from-being-changed-while-processing/4693064#4693064 – Vbp

Respuesta

40

Basta con abrir exclusivamente:

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

Ref.

Actualización: En respuesta al comentario del anunciante: De acuerdo con el MSDN doco en línea, File.Open es compatible con .Net Compact Framework 1.0 y 2.0.

+4

Y mientras lo hace, haga Asegúrese de no perder la referencia y demorar el desbloqueo hasta que el GC lo libere de manera no determinista: use la interfaz IDisposable, por ejemplo, ajustando la declaración anterior en un bloque 'using'. –

+1

No estoy seguro de que esto responda la pregunta. OP está buscando el método FileStream.Lock, que no existe en el marco compacto. El bloqueo impide que otros procesos modifiquen el archivo, pero aún así les permite leerlo. Creo que su método bloquearía completamente otros procesos. – MusiGenesis

+0

@MusiGenesis: El cartel parece estar preguntando cómo bloquear un archivo ... –

0

Esto es equivalente a la respuesta de Mitch, excepto que parece estar disponible en más versiones de .Net. El único argumento significativo es FileShare.None; los otros habilitan esa sobrecarga del constructor, pero sus valores están determinados por cómo usará la secuencia.

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

FileShare.NONE arrojaría un error de "System.IO.IOException" si otro hilo está tratando de acceder al archivo.

Puede usar alguna función usando try/catch para esperar a que se lance el archivo. Ejemplo here.

O puede utilizar una declaración de bloqueo con alguna variable "ficticia" antes de acceder a la función de escritura:

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

    } 

También se puede utilizar el "bloqueo" declaración en la propia función de escritura real (es decir, dentro de AddLog) en lugar de en las funciones del trabajador de fondo.