Attendre que le fichier soit complètement écrit
Lorsqu'un fichier est créé dans un répertoire surveillé, une tâche courante consiste à le copier dans un autre emplacement. Cependant, les transferts de fichiers volumineux peuvent entraîner des échecs car le fichier n'est pas complètement écrit avant le début du processus de copie.
Pour résoudre ce problème, une solution de contournement consiste à vérifier l'état du fichier avant la copie. Une méthode consiste à utiliser la fonction IsFileLocked, qui renvoie True si le fichier est toujours en cours d'écriture ou de traitement par un autre thread. Voici un exemple :
private bool IsFileLocked(FileInfo file) { FileStream stream = null; try { stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); } catch (IOException) { return true; } finally { if (stream != null) stream.Close(); } return false; }
Ce code peut être incorporé dans votre gestionnaire d'événements FileSystemWatcher_Created :
public static void listener_Created(object sender, FileSystemEventArgs e) { while (IsFileLocked(new FileInfo(e.FullPath))) { // Wait for file to finish writing } File.Copy(e.FullPath, @"D:\levan\FolderListenerTest\CopiedFilesFolder\" + e.Name); }
Vous pouvez également utiliser la méthode suivante :
const int ERROR_SHARING_VIOLATION = 32; const int ERROR_LOCK_VIOLATION = 33; private bool IsFileLocked(string file) { if (File.Exists(file) == true) { FileStream stream = null; try { stream = File.Open(file, FileMode.Open, FileAccess.ReadWrite, FileShare.None); } catch (Exception ex2) { int errorCode = Marshal.GetHRForException(ex2) & ((1 << 16) - 1); if ((ex2 is IOException) && (errorCode == ERROR_SHARING_VIOLATION || errorCode == ERROR_LOCK_VIOLATION)) { return true; } } finally { if (stream != null) stream.Close(); } } return false; }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!