System.IOException при открытии файла с помощью File.OpenRead - PullRequest
0 голосов
/ 26 августа 2010

При открытии файла для разархивирования его содержимого я получаю следующее исключение.Это происходит, когда у меня выбран файл в проводнике Windows или при наведении указателя мыши на него появляется всплывающая подсказка.

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: 

Можно ли просто подождать, пока файл больше не используется, а затем прочитать его?Обычно я просто просматриваю папку для любых новых zip-файлов, распаковываю содержимое zip-файла и удаляю его.

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;

Обработчик событий:

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);
}

Ответы [ 3 ]

4 голосов
/ 26 августа 2010

Это совершенно нормально, когда вы используете FileSystemWatcher. очень вероятно, что файл, для которого вы получаете уведомление, используется процессом, который создал или изменил файл.Вам придется подождать, пока процесс не прекратит его использовать.Конечно, вы не можете предсказать, когда это произойдет.

Общий подход состоит в том, чтобы поместить путь к файлу в список, который вы периодически сканируете, запускаемый таймером.В конце концов вы получите доступ к файлу.

1 голос
/ 24 июня 2012

Иногда, если вы все равно просто копируете ошибку, вместо использования File.OpenRead измените ее на:

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); 
} 
1 голос
/ 26 августа 2010

Может быть это помогает. Описывает несколько способов проверить, используется ли файл ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...