2016-07-17 2 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 
Смежные вопросы