2009-07-24 17 views
12

Voglio verificare se un elenco di file è in uso o non è scrivibile prima di iniziare a sostituire i file. Certo, so che il tempo dal controllo dei file e la copia dei file c'è la possibilità che uno o più file vengano bloccati da qualcun altro, ma io gestisco tali eccezioni. Voglio eseguire questo test prima della copia del file perché l'elenco completo dei file ha una migliore possibilità di riuscita rispetto a quando un file nel mezzo dell'operazione non viene sostituito.C#: controlla se un file non è bloccato e scrivibile

Qualcuno di voi un esempio o un suggerimento nella giusta direzione

+1

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

risposta

-2

Leggi un byte, scrivere stesso byte?

0

È necessario aprire ciascun file per la scrittura per verificarlo.

9

v'è alcuna garanzia che la lista si ottiene, in qualsiasi punto del tempo, sta andando a rimanere lo stesso il prossimo secondo come qualcun altro potrebbe prendi il controllo del file quando torni da loro.

Vedo un modo sebbene - "BLOCCA" i file che si desidera sostituire ottenendo i corrispondenti oggetti FileStream. In questo modo sei sicuro di aver bloccato tutti i file "disponibili" aprendoli e quindi puoi sostituirli nel modo desiderato.

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

Detto questo, è meglio provare a sostituirli uno per uno e ignorare quelli che non è possibile.

Problemi correlati