IO.File.Delete Random UnauthorizedAccessException - PullRequest
0 голосов
/ 28 ноября 2010

Я использую My.Computer.Filesystem.WriteAllBytes для записи исполняемого файла, хранящегося в ресурсах моего приложения, в его загрузочную директорию. После запуска исполняемого файла я затем удаляю его. Все отлично работает; однако, я случайно получу исключение 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

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

Ответы [ 2 ]

3 голосов
/ 28 ноября 2010

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

1 голос
/ 28 ноября 2010

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

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

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