Dans mon environnement de test, j'ai deux clients physiques Windows 7. Tous deux ont accès à un partage réseau, hébergé sur un système Windows Server.
Les clients, respectivement, exécutent une application qui peut tenter d'opérer (lire ou écrire) sur le même fichier texte au même moment.
Je veux utiliser le FileInfo.Open() pour réaliser différents scénarios :
Scénario 1 : L'application permet de lire en même temps. Elle doit échouer si une autre instance est en train d'y écrire.
J'utiliserais
FileInfo fi = new FileInfo(filePath);
using (FileStream fs = fi.Open(FileMode.Open, FileAccess.Read, FileShare.Read))
{
// Do some read operations...
Console.WriteLine("Press ENTER to close file-stream...");
Console.ReadLine();
}
pour ça.
Scénario 2 : Une seule instance est autorisée à ouvrir un fichier pour tenter d'y écrire. Et elle doit échouer si une autre instance est en train de le lire.
J'utiliserais
FileInfo fi = new FileInfo(filePath);
using (FileStream fs = fi.Open(FileMode.Open, FileAccess.Write, FileShare.None))
{
// Do some write operations...
Console.WriteLine("Press ENTER to close file-stream...");
Console.ReadLine();
}
pour ça.
Avec les extraits de code ci-dessus, mes scénarios fonctionnent comme prévu. Même si j'ai fermé une instance à l'intérieur de la fenêtre using(...)
le fichier est "déverrouillé".
Q1 : Je me demande si quelque chose pourrait se produire en cas de plantage de l'application, de sorte que les autres instances se voient refuser l'accès au fichier (pendant un certain temps ?).
Q2 : Que se passe-t-il en cas de perte de la connexion réseau lors de l'ouverture d'un fichier ?
Q3 : Y a-t-il des raisons d'utiliser (en plus) l'option FileStream.Lock() y Déverrouiller() pour verrouiller et déverrouiller explicitement un fichier ?
Q4 : Le système des serveurs nécessite-t-il quelque chose pour que cette façon de verrouiller les fichiers fonctionne ?
Q5 : Y a-t-il d'autres points auxquels je dois réfléchir ?