2009-07-24 9 views
12

Quiero comprobar si una lista de archivos está en uso o no se puede escribir antes de comenzar a reemplazar archivos. Claro que sé que el tiempo de la verificación de archivos y de la copia de archivos existe la posibilidad de que uno o más archivos vayan a ser bloqueados por otra persona, pero yo manejo esas excepciones. Quiero ejecutar esta prueba antes de la copia de archivo porque la lista completa de archivos tiene una mayor probabilidad de éxito que si un archivo en el medio de la operación no puede ser reemplazado.C#: compruebe si un archivo no está bloqueado y puede escribir

¿Alguno de ustedes un ejemplo o una pista en la dirección correcta

+1

duplidate de http://stackoverflow.com/questions/1304/how-to-check-for-file-lock-in-c – TheVillageIdiot

Respuesta

-2

Leer un byte, escribir mismo byte?

0

Debe abrir cada archivo para escribir con el fin de probar esto.

9

No hay garantía de que la lista que se obtiene, en cualquier punto del tiempo, va a permanecer igual al segundo siguiente como alguien más podría toma el control del archivo cuando vuelvas a él.

Veo una sola vía: "BLOQUEAR" los archivos que desea reemplazar obteniendo sus objetos FileStream correspondientes. De esta manera, está seguro de haber bloqueado todos los archivos "disponibles" abriéndolos y luego puede reemplazarlos de la manera que desee.

public void TestGivenFiles(List<string> listFiles) 
{ 
     List<FileStream> replaceAbleFileStreams = GetFileStreams(listFiles); 


     Console.WriteLine("files Received = " + replaceAbleFileStreams.Count); 
     foreach (FileStream fileStream in replaceAbleFileStreams) 
     { 
      // Replace the files the way you want to. 
      fileStream.Close(); 
     } 
    } 
    public List<FileStream> GetFileStreams(List<string> listFilesToReplace) 
    { 
     List<FileStream> replaceableFiles = new List<FileStream>(); 
     foreach (string sFileLocation in listFilesToReplace) 
     { 
      FileAttributes fileAttributes = File.GetAttributes(sFileLocation); 
      if ((fileAttributes & FileAttributes.ReadOnly) != FileAttributes.ReadOnly) 
      { // Make sure that the file is NOT read-only 
       try 
       { 
        FileStream currentWriteableFile = File.OpenWrite(sFileLocation); 
        replaceableFiles.Add(currentWriteableFile); 
       } 
       catch 
       { 
        Console.WriteLine("Could not get Stream for '" + sFileLocation+ "'. Possibly in use"); 
       } 
      } 
     } 
     return replaceableFiles; 
    } 

Dicho esto, será mejor que intentes reemplazarlos uno por uno e ignores los que no puedes.

Cuestiones relacionadas