我不明白这个例外

时间:2016-07-17 01:27:41

标签: vb.net

我试图创建一个程序,检查目录是否存在,如果没有,然后创建它并将文件移入其中,如果它确实存在则不要创建目录但只是移动文件,虽然我遇到了异常但我不明白为什么。

例外:

  

未处理的类型' 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

该异常表明它不允许创建目录,因为该目录已经存在,但即使我在运行程序之前删除了目录,它仍然会给我异常,即使它创建了目录没问题,它也没有突出显示创建目录的行,而是突出显示负责将文件作为异常源移动的行。

一些帮助将不胜感激:)

4 个答案:

答案 0 :(得分: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")

答案 1 :(得分: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 :(得分: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

答案 3 :(得分: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