Qu’advient-il d’un stream de fichiers lorsque le fichier est supprimé par un processus différent?

En C #, j’ouvre un fichier avec FileShare.Delete. Cela me permet d’ouvrir le fichier sans restreindre la suppression d’autres processus. Par exemple:

using (FileStream fs = new FileStream(@"C:\temp\1.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete)) { int len = (int)fs.Length; byte[] array = new byte[len]; int bytesRead = fs.Read(array, 0, len); } 

Mes questions sont:

  1. Que se passe-t-il si le fichier est supprimé par un processus différent après la création du stream, mais avant sa lecture? Le système d’exploitation conserve-t-il une copie du fichier jusqu’à ce que le stream \ handle soit fermé?
  2. Puis-je compter sur la lecture du fichier supprimé sans erreur ni contenu erroné?

Le fichier est marqué pour suppression, mais n’est pas réellement supprimé tant que le dernier handle ouvert n’a pas été fermé, comme décrit dans la documentation de DeleteFile .

Notez que vous ne pouvez pas ouvrir un nouveau handle pour un fichier marqué pour suppression, mais le fichier apparaîtra toujours dans les listes de répertoires et ne peut pas être remplacé par un fichier du même nom jusqu’à ce qu’il soit réellement supprimé. Ceci est différent des systèmes Unix dans lesquels le fichier disparaît du répertoire (est “non lié”) immédiatement. Comme Ben le suggère dans les commentaires, vous pouvez contourner ce problème en renommant et / ou en déplaçant le fichier avant de le supprimer.

De plus, comme MoonRabbit l’a fait remarquer, vous pouvez “supprimer” un fichier ouvert à l’aide d’Explorer, mais c’est parce que cela ne fait que déplacer le fichier dans la corbeille. L’option Maj + Suppr pour supprimer un fichier immédiatement ne fonctionnera pas.

Oui, un autre processus peut supprimer le fichier, mais vous n’obtiendrez aucune exception car le pointeur vers le fichier sur le disque a été créé. Votre processus continuera sa lecture, mais lorsque vous réessayez d’ouvrir le stream, vous obtiendrez une exception comme entrée dans le fichier. le système de fichiers n’existe pas

voici un exemple complet pour reproduire votre cas

essayez de l’exécuter et allez dans l’explorateur et supprimez votre fichier

  class Program { static void Main(ssortingng[] args) { for (int i = 0; i < 10000; i++) { File.AppendAllText(@"c:\temp\1.txt", Guid.NewGuid().ToString()); } //read the file using (FileStream fs = new FileStream(@"C:\temp\1.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete)) { while (fs.CanRead) { //here I read a chunk of 1000 bytes to let stream open int len = 1000; Thread.Sleep(1000); byte[] array = new byte[len]; int bytesRead = fs.Read(array, 0, len); } } } }