2010-11-27 5 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

1

파일을 쓰는 데 별도의 프로세스를 사용하는 것처럼 보입니다. 삭제하려고하면 파일을 계속 사용하는 것 같습니다.

예외를 잡아서 처리하는 것이 좋습니다.