0

Je reçois l'exception suivante lorsque j'ouvre un fichier pour décompresser son contenu. Cela se produit lorsque le fichier est sélectionné dans l'Explorateur Windows ou que la souris affiche une info-bulle.System.IOException lors de l'ouverture du fichier avec File.OpenRead

System.IO.IOException was unhandled 
    Message=The process cannot access the file 'D:\Documents\AutoUnZip\Zips\MVCContrib.Extras.release.zip' because it is being used by another process. 
    Source=mscorlib 
    StackTrace: 
     at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
     at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) 
     at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) 
     at System.IO.File.OpenRead(String path) 
     at AutoUnzip.SelectFolderForm.w_Changed(Object sender, FileSystemEventArgs e) in D:\Projects\WindowsForms\AutoUnzip\AutoUnzip\SelectFolderForm.cs:line 37 
     at System.IO.FileSystemWatcher.OnCreated(FileSystemEventArgs e) 
     at System.IO.FileSystemWatcher.NotifyFileSystemEventArgs(Int32 action, String name) 
     at System.IO.FileSystemWatcher.CompletionStatusChanged(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* overlappedPointer) 
     at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP) 
    InnerException: 

Est-il possible d'attendre que le fichier ne soit plus utilisé et de le lire? Fondamentalement, je regarde juste un dossier pour tous les nouveaux fichiers zip, décompressez le contenu du fichier zip, puis supprimez-le.

FileSystemWatcher watcher = new FileSystemWatcher("C:\\Path\\To\\Folder\\"); 
watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName; 
watcher.Filter = "*.zip"; 
watcher.Created += new FileSystemEventHandler(w_Changed); 
// Begin watching. 
watcher.EnableRaisingEvents = true; 

Gestionnaire d'événements:

void w_Changed(object sender, FileSystemEventArgs e) 
{ 
    // IOException on following line 
    using (ZipInputStream s = new ZipInputStream(File.OpenRead(e.FullPath))) 
    { 
     ... 
    } 
    // delete the zip file 
    File.Delete(e.FullPath); 
} 
+0

une solution finale avec l'échantillon complet du code source de travail à ce sujet? – Kiquenet

Répondre

4

Ceci est tout à fait normal lorsque vous utilisez FileSystemWatcher. C'est très probablement que le fichier pour lequel vous recevez la notification est utilisé par le processus qui a créé ou modifié le fichier. Vous devrez attendre que le processus cesse de l'utiliser. Vous ne pouvez évidemment pas prédire quand cela se produit.

Une approche générique consiste à placer le chemin d'accès au fichier dans une liste que vous numérisez périodiquement, déclenchée par un temporisateur. Finalement, vous aurez accès au fichier.

+0

Ne pouvez-vous pas ouvrir un fichier (en lecture), lorsqu'un autre processus le lit? – SamWM

+1

Habituellement, vous pouvez, cela dépend de l'application. Mais cela ne génèrerait pas de notification FSW car le fichier ne serait pas modifié. –

1

Peut-être this aide. Décrit quelques façons de vérifier si un fichier est utilisé ...

1

Parfois, si vous êtes juste copier l'erreur jeter quand même au lieu d'utiliser File.OpenRead changer pour:

void w_Changed(object sender, FileSystemEventArgs e) 
{ 
    // IOException on following line 
    using (ZipInputStream s = new ZipInputStream(new System.IO.FileStream(e.FullPath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite))) 
    { 
     ... 
    } 
    // delete the zip file 
    File.Delete(e.FullPath); 
}