2010-11-27 1 views
0

Я использую My.Computer.Filesystem.WriteAllBytes для записи исполняемого файла, хранящегося в ресурсах моего приложения, в его каталог запуска. После запуска исполняемого файла я удалю его. Все работает нормально; однако я случайно получаю UnauthorizedAccessException без причины. Получив исключение, я могу вручную удалить файл без проблем. Вот полный код:IO.File.Delete Случайный UnauthorizedAccessException

' Convert MP3 
' First, copy out converter 
Dim Path = New IO.FileInfo(SoundPath) 
Try 
    My.Computer.FileSystem.WriteAllBytes(Application.StartupPath + "\converter.exe", My.Resources.madplay, False) 
Catch ex As Exception 
    MessageBox.Show(ex.ToString, "Report", MessageBoxButtons.OK) 
    Exit Sub 
End Try 
' Set up process 
Dim MAD As New Process 
' Set process info 
Dim output As String = IO.Path.GetFileNameWithoutExtension(Path.FullName) + ".wav" 
Dim input As String = Path.FullName 
Dim adjust As String = barVolumeAdjust.Value.ToString 
Dim hz As String = "15000" 
With (MAD.StartInfo) 
    .FileName = Application.StartupPath + "\converter.exe" 
    .Arguments = "-v -a " + adjust + " -R " + hz + " -o """ + output + """ """ + input + """" 
    .UseShellExecute = False 
    .RedirectStandardInput = True 
    .RedirectStandardError = True 
    .RedirectStandardOutput = True 
    .CreateNoWindow = True 
End With 
' Start 
MAD.Start() 
' Update title with output 
Dim Line As String = MAD.StandardError.ReadLine 
While Not Line Is Nothing 
    Me.Text = Line 
    Line = MAD.StandardError.ReadLine 
End While 
' Stop 
MAD.Close() 
' Delete MAD 
Try 
    IO.File.Delete(Application.StartupPath + "\converter.exe") 
Catch ex As Exception 
    MessageBox.Show(ex.ToString, "Report", MessageBoxButtons.OK) 
End Try 

Что озадачивает меня, что я буквально только написал исполняемый, и ничто другое не могло бы быть его использовать. Я проверил атрибуты файла, и он не доступен только для чтения. Мое приложение также работает как администратор. В чем может быть проблема?

ответ

3

Вы не ждете завершения процесса, поэтому он все еще работает при попытке удалить файл. См. Процесс. WaitForExit

+0

Ах, хорошо, я не могу поверить, что я этого не замечал. Я заменил MAD.Close() на MAD.WaitForExit(), и все выглядит хорошо! Благодаря! – Steven 2010-11-28 01:13:01

1

Похоже, что вы используете отдельный процесс для записи файла - возможно, это все еще используется файл при попытке удалить.

Я предлагаю поймать и обработать исключение, чтобы обойти проблему.