我试图创建一个程序,检查目录是否存在,如果没有,然后创建它并将文件移入其中,如果它确实存在则不要创建目录但只是移动文件,虽然我遇到了异常但我不明白为什么。
例外:
未处理的类型' 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
该异常表明它不允许创建目录,因为该目录已经存在,但即使我在运行程序之前删除了目录,它仍然会给我异常,即使它创建了目录没问题,它也没有突出显示创建目录的行,而是突出显示负责将文件作为异常源移动的行。
一些帮助将不胜感激:)
答案 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