2009-09-16 6 views
16

s'il vous plaît me dire comment verrouiller le fichier en C#Comment verrouiller le fichier

Merci

+0

Cela pourrait entraîner des dizaines de réponses différentes, qui seraient toutes valables. S'il vous plaît ajouter plus de détails. (Btw, juste l'avis que le fichier pourrait déjà bloquer un certain nombre d'autres d'y accéder.) –

+7

Insérez la clé, tournez-le vers la gauche. –

+0

Cela a fonctionné pour moi http://stackoverflow.com/questions/4692981/c-sharp-blocking-a-folder-from-being-changed-while-processing/4693064#4693064 – Vbp

Répondre

40

Il suffit d'ouvrir exclusivement:

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

Ref.

Mise à jour: En réponse au commentaire de l'affiche: Selon le MSDN doco en ligne, File.Open est pris en charge dans .Net Compact Framework 1.0 et 2.0.

+4

Et pendant que vous y êtes, faites Assurez-vous de ne pas perdre la référence et de retarder le déverrouillage jusqu'à ce que le GC le libère de manière non déterministe - utilisez l'interface IDisposable, par exemple en enveloppant l'instruction ci-dessus dans un bloc 'using'. –

+1

Je ne suis pas sûr que cela répond à la question. OP recherche la méthode FileStream.Lock, qui n'existe pas dans le framework compact. Lock empêche les autres processus de modifier le fichier, mais les laisse quand même le lire. Je pense que votre méthode bloquerait complètement les autres processus. – MusiGenesis

+0

@MusiGenesis: L'affiche semble demander comment verrouiller un fichier ... –

0

Ceci est équivalent à la réponse de Mitch, sauf qu'il semble être disponible dans d'autres versions de .Net. Le seul argument significatif est FileShare.None; les autres activent cette surcharge du constructeur, mais leurs valeurs sont déterminées par la façon dont vous utiliserez le flux.

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

FileShare.None jetterait une erreur « System.IO.IOException » si un autre thread tente d'accéder au fichier.

Vous pouvez utiliser une fonction en utilisant try/catch pour attendre la libération du fichier. Exemple here.

Ou vous pouvez utiliser une instruction de verrouillage avec une variable « factice » avant d'accéder à la fonction d'écriture:

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

    } 

Vous pouvez également utiliser l'instruction « verrouillage » dans la fonction d'écriture réelle lui-même (à savoir l'intérieur AddLog) au lieu de dans les fonctions de l'arrière-plan du travailleur.

Questions connexes