Vb.net 当试图删除正在使用的文件时,如何捕获异常?

Vb.net 当试图删除正在使用的文件时,如何捕获异常?,vb.net,Vb.net,我没有制作程序来删除临时文件夹中的文件。我已经掌握了删除文件的代码,但我似乎不知道如何跳过正在使用的文件或捕获异常,以便我的程序在尝试删除正在使用的文件时不会崩溃 以下是我目前掌握的代码: Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click If CheckBox1.Checked = True Then

我没有制作程序来删除临时文件夹中的文件。我已经掌握了删除文件的代码,但我似乎不知道如何跳过正在使用的文件或捕获异常,以便我的程序在尝试删除正在使用的文件时不会崩溃

以下是我目前掌握的代码:

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        If CheckBox1.Checked = True Then
            Dim s As String
            For Each s In System.IO.Directory.GetFiles("C:\Users\" + System.Environment.UserName + "\AppData\Local\Temp")
                System.IO.File.Delete(s)
            Next s
        End If
end sub

使用Try/Catch块捕获错误和异常

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click If CheckBox1.Checked = True Then Dim s As String For Each s In System.IO.Directory.GetFiles("C:\Users\" + System.Environment.UserName + "\AppData\Local\Temp") Try System.IO.File.Delete(s) Catch ex As Exception Console.WriteLine("File could not be deleted : {0}", ex.Message) End Try Next s End If end sub
这将允许您的程序忽略错误并继续处理下一项。

使用Try/Catch块捕获错误和异常

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click If CheckBox1.Checked = True Then Dim s As String For Each s In System.IO.Directory.GetFiles("C:\Users\" + System.Environment.UserName + "\AppData\Local\Temp") Try System.IO.File.Delete(s) Catch ex As Exception Console.WriteLine("File could not be deleted : {0}", ex.Message) End Try Next s End If end sub
这将允许您的程序忽略错误并继续处理下一项。

当抛出异常时,一旦Catch处理该异常,执行将跳转到Try结束。因此,在何处放置Try/Catch块的开头和结尾非常重要。例如:

Try
    Dim s As String
    For Each s In System.IO.Directory.GetFiles("C:\Users\" + System.Environment.UserName + "\AppData\Local\Temp")
        System.IO.File.Delete(s)
    Next s
Catch ex As IOException
End Try
在上面的示例中,如果任何Delete调用失败,它将跳转到Try结尾并跳过For循环的其余迭代,从而跳过其余的文件。但是,考虑一下:

Dim s As String
For Each s In System.IO.Directory.GetFiles("C:\Users\" + System.Environment.UserName + "\AppData\Local\Temp")
    Try
        System.IO.File.Delete(s)
    Catch ex As IOException
    End Try
Next s
在第二个示例中,它将跳转到结束Try,然后继续到For循环的下一个迭代,从而继续处理列表中的下一个文件


此外,正如上面的注释所述,您肯定应该使用Path.GetTempPath来获取临时文件夹的路径。您不应该自己构建路径,因为它可能会改变。例如,Windows不要求用户文件夹必须位于C:\Users下。实际上,您可以更改它。

当抛出异常时,一旦Catch处理了它,执行将跳到Try的末尾。因此,在何处放置Try/Catch块的开头和结尾非常重要。例如:

Try
    Dim s As String
    For Each s In System.IO.Directory.GetFiles("C:\Users\" + System.Environment.UserName + "\AppData\Local\Temp")
        System.IO.File.Delete(s)
    Next s
Catch ex As IOException
End Try
在上面的示例中,如果任何Delete调用失败,它将跳转到Try结尾并跳过For循环的其余迭代,从而跳过其余的文件。但是,考虑一下:

Dim s As String
For Each s In System.IO.Directory.GetFiles("C:\Users\" + System.Environment.UserName + "\AppData\Local\Temp")
    Try
        System.IO.File.Delete(s)
    Catch ex As IOException
    End Try
Next s
在第二个示例中,它将跳转到结束Try,然后继续到For循环的下一个迭代,从而继续处理列表中的下一个文件


此外,正如上面的注释所述,您肯定应该使用Path.GetTempPath来获取临时文件夹的路径。您不应该自己构建路径,因为它可能会改变。例如,Windows不要求用户文件夹必须位于C:\Users下。实际上你可以改变这一点。

是你的朋友。不能100%保证用户的配置文件目录与其用户名的形式完全相同,也不能保证C:\Users是配置文件目录的正确根路径。他是你的朋友。不能100%保证用户的配置文件目录与其用户名的形式完全相同,也不能保证C:\Users是配置文件目录的正确根路径。不喜欢出错后继续下一步?:^这很好,我也在尝试做同样的事情,但我在下一个s之后尝试过,这可能就是为什么,感谢bunchNo的爱,这件事本来就不应该存在的原因:我不会投反对票,但抓住一个普遍的例外是非常坏的主意,当它存在的时候。没有对下一个错误的爱^这很好,我也在尝试做同样的事情,但我在下一个s之后尝试过,这可能就是为什么,感谢一个邦奇诺人的爱,这件事根本不应该存在的原因:我不会投反对票,但如果存在一个通用的异常,抓住它是一个非常糟糕的主意。吃这样的异常是一个糟糕的做法。@neolik是的,是的。我只是想让这个例子简单一些,但你是对的,我甚至不应该暗示这样的事情是好的做法。我更新了我的答案。再次感谢!吃这种异常的坏习惯。@Neolisk是的,它是。我只是想让这个例子简单一些,但你是对的,我甚至不应该暗示这样的事情是好的做法。我更新了我的答案。再次感谢!