2017-08-02 2 views
0

J'ai besoin de lire le contenu d'un fichier et de l'écraser pendant que le fichier est verrouillé. Je ne veux pas que le fichier soit déverrouillé entre les opérations de lecture et d'écriture.Comment bloquer un fichier, lire son contenu et le remplacer?

using (var file = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) 
{ 
    using (var reader = new StreamReader(file, Encoding.Unicode)) 
    using (var writer = new StreamWriter(file, Encoding.Unicode)) 
    { 
    // read 
    // calculate new content 
    // overwrite - how do I do this??? 
    } 
} 

Si j'utilise deux FileStream s, le fichier est effacé lors de l'instanciation de l'écrivain, mais le fichier sera brièvement déverrouillé entre le lecteur et l'écrivain instanciation.

using (var reader = new StreamReader(new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Read, FileShare.None))) 
{ 
    // read 
    // calculate new content 
} 

using (var writer = new StreamWriter(new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None))) 
{ 
    // write 
} 

Répondre

3

Si vous continuez à ouvrir le FileStream d'origine, vous pouvez le faire:

using (var file = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) 
{ 
    // This overload will leave the underlying stream open 
    using (var reader = new StreamReader(file, Encoding.Unicode, true, 4096, true)) 
    { 
     //Read 
    } 

    file.SetLength(0); //Truncate the file and seek to 0 

    using (var writer = new StreamWriter(file, Encoding.Unicode)) 
    { 
     //Write the new data 
    } 
} 
+0

Cela prend une dépendance à l'égard v4.5 depuis le cteur avec leaveOpen n'est pas disponible avant lui. –

+0

Merci pour la réponse rapide! –

+0

Il n'y a aucune raison d'utiliser le nouveau paramètre 'leaveOpen' pour résoudre ce problème. L'ouverture du fichier en lecture/écriture est suffisante. Le lecteur et l'éditeur peuvent tous deux être créés en même temps, avec la longueur de flux sous-jacente définie après la lecture, mais avant l'écriture. –