2016-07-17 5 views
0

디렉토리가 존재하는지 확인하고, 파일을 생성하지 않고 파일을 옮기는 프로그램이 있는지 확인한다. 디렉토리로 이동하지만 파일을 이동하십시오. 예외가 발생하지만 이유는 알 수 없습니다.이 예외를 이해할 수 없다.

예외 :

유형 'System.IO.IOException'처리되지 않은 예외가 microsoft.visualbasic.dll

에서 발생

추가 정보 : 완료 할 수 없습니다 작업 디렉토리가 이미이 경로에 존재하기 때문에 'E : \ SteamLibrary \ steamapps \ common \ Grand Theft Auto V \ ModManagerModBackup'을 클릭하십시오.

Private Sub Backup1_Click(sender As Object, e As EventArgs) Handles Backup1.Click 
    If Not My.Computer.FileSystem.DirectoryExists("E:\SteamLibrary\steamapps\common\Grand Theft Auto V\ModManagerModBackup") Then 
     My.Computer.FileSystem.CreateDirectory("E:\SteamLibrary\steamapps\common\Grand Theft Auto V\ModManagerModBackup") 
     My.Computer.FileSystem.MoveFile("E:\SteamLibrary\steamapps\common\Grand Theft Auto V\ScriptHookV.dll", ("E:\SteamLibrary\steamapps\common\Grand Theft Auto V\ModManagerModBackup")) 
    ElseIf My.Computer.FileSystem.DirectoryExists("E:\SteamLibrary\steamapps\common\Grand Theft Auto V\ModManagerModBackup") Then 
     My.Computer.FileSystem.MoveFile("E:\SteamLibrary\steamapps\common\Grand Theft Auto V\ScriptHookV.dll", ("E:\SteamLibrary\steamapps\common\Grand Theft Auto V\ModManagerModBackup")) 
    End If 

End Sub 

이 예외는 디렉토리가 이미 존재하기 때문에이 디렉토리의 작성을 허용하지 않습니다 것을 제안하지만, 심지어는 실행하기 전에 디렉토리를 삭제할 때 :

코드 지금까지이 프로그램은 문제가없는 디렉토리를 만들었지 만 예외를 제공하지만 디렉토리를 만드는 라인을 강조 표시하지 않고 파일을 예외 소스로 이동시키는 라인을 강조합니다.

는 어떤 도움을 주시면 감사하겠습니다 :) 오류의 전체 스택 추적을 보여 주면

답변

2

그것은 항상 좋습니다. 그런 다음 MoveFile에 전화 할 때 오류가 발생했음을 분명히 알 수 있습니다.

문제는 MoveFile의 두 번째 매개 변수는 대상 파일 경로, 그리고 대상 디렉토리 경로해야한다는 것입니다. 지금

, 다음 줄은 :

My.Computer.FileSystem.MoveFile("E:\SteamLibrary\steamapps\common\Grand Theft Auto V\ScriptHookV.dll", ("E:\SteamLibrary\steamapps\common\Grand Theft Auto V\ModManagerModBackup")) 

... 분명히 유효하지 않은 파일E:\SteamLibrary\steamapps\common\Grand Theft Auto V\ModManagerModBackup을 만들려고 시도합니다.

당신은 그것을 변경해야합니다 :

My.Computer.FileSystem.MoveFile("E:\SteamLibrary\steamapps\common\Grand Theft Auto V\ScriptHookV.dll", "E:\SteamLibrary\steamapps\common\Grand Theft Auto V\ModManagerModBackup\ScriptHookV.dll") 
2

귀하의 이동 파일 코드는 대상 파일 이름 대신 대상 디렉토리의 이름을 전달합니다. 반복 코드를 피하기 위해 로직을 업데이트 할 수도 있습니다.

Private Sub Backup1_Click(sender As Object, e As EventArgs) Handles Backup1.Click 
    If Not My.Computer.FileSystem.DirectoryExists("E:\SteamLibrary\steamapps\common\Grand Theft Auto V\ModManagerModBackup") Then 
     My.Computer.FileSystem.CreateDirectory("E:\SteamLibrary\steamapps\common\Grand Theft Auto V\ModManagerModBackup") 
    End If 
    My.Computer.FileSystem.MoveFile("E:\SteamLibrary\steamapps\common\Grand Theft Auto V\ScriptHookV.dll", ("E:\SteamLibrary\steamapps\common\Grand Theft Auto V\ModManagerModBackup\ScriptHookV.dll")) 
End Sub 
2

다른 사람들은이 질문에 아주 잘 대답했지만, 나는 대답의 형태로 확장 된 의견을 추가 할 것이라고 생각했습니다.

이러한 종류의 문제는 코드에서 데이터를 분리하는 간결한 방법으로 코드를 작성함으로써 피할 수 있습니다. 이 경우의 데이터는 모든 경로입니다.

당신은 버그를보고는 명확하고 쉽게이 같은 코드를 작성할 수

또한
With My.Computer.FileSystem 

    Dim parent = "E:\SteamLibrary\steamapps\common\Grand Theft Auto V" 
    Dim modBackup = .CombinePath(parent, "ModManagerModBackup") 
    Dim dll = "ScriptHookV.dll" 

    If Not .DirectoryExists(modBackup) Then 
     .CreateDirectory(modBackup) 
    End If 
    .MoveFile(.CombinePath(parent, dll), .CombinePath(modBackup, dll)) 

End With 
1

존재하지 않는 경우 MoveFile 폴더를 생성합니다

Private Sub Backup1_Click(sender As Object, e As EventArgs) Handles Backup1.Click 
    Dim path = "E:\SteamLibrary\steamapps\common\Grand Theft Auto V\" 
    My.Computer.FileSystem.MoveFile(path & "ScriptHookV.dll", 
            path & "ModManagerModBackup\ScriptHookV.dll") 
End Sub 
관련 문제