我是第一次使用VB.NET,检查文件是否正在使用,但有些代码行我不能完全理解。
有人可以在评论中解释下面突出显示的两行代码吗?
Public Sub Main()
IsFileInUse("C:\someFolder\file.pdf")
End Sub
Function IsFileInUse(filePath As String) As Boolean
IsFileInUse = False
If System.IO.File.Exists(filePath) Then
Dim fileInfo As System.IO.FileInfo
Dim stream As System.IO.FileStream
fileInfo = New System.IO.FileInfo(filePath)
Try
' Can someone explain this line of code?
' how does this determines where to go from here, Catch or Finally?
stream = fileInfo.Open(System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite, System.IO.FileShare.None)
Catch
IsFileInUse = True
MessageBox.Show("It looks like the file is opened")
Finally
If stream IsNot Nothing Then
' What is this closing?
stream.Close()
End If
End Try
Else
MessageBox.Show("File does NOT Exist")
End If
End Function
答案 0 :(得分:2)
这如何确定从这里开始的地方,Catch还是Finally?
查看documentation for FileInfo.Open。 “例外”部分显示了可能发生的所有可能异常。
如果抛出异常,将执行Catch块。
无论是否抛出异常,始终会执行Finally块。
这是什么结束?
它将释放流的资源,在这种情况下它将关闭文件。
答案 1 :(得分:1)
Try块运行代码。在Try块中,流用于打开文件并访问其内容。如果该代码因任何原因发生错误,它将抛出异常,然后将导致Catch块运行。无论是否抛出异常,代码的Finally块都将运行。在Finally块中,正在关闭File的流。
答案 2 :(得分:1)
代码正在确定文件当前是否正在使用"通过尝试打开具有读/写访问权限的文件的任何其他进程。无论文件的打开是否失败,它总是关闭文件流。它假设如果在该模式下打开文件因任何原因失败,那么它必须是因为它是"在使用"。这是一个不好的假设,也可能不是最好的方法来实现它,但是它的价值,它是它的所作所为。
Try
/ Catch
块是VB.NET用于异常处理的首选语法(它取代了早于.NET的旧On Error
语法)。当Try
部分内的任何内容抛出异常时,执行将跳转到Catch
部分。完成Catch
部分的执行后,它会跳转到Finally
部分。如果Try
部分中没有任何内容引发异常,那么一旦完成,它也会跳转到Finally
部分。基本上,最后一节中的所有内容都是"保证"执行,无论是否发生异常,而Catch
部分中的代码仅在发生异常时执行。
换句话说,请考虑这个例子:
' Outputs "ABCE" (does not output "D")
Console.Write("A")
Try
Console.Write("B")
Console.Write("C")
Catch
Console.Write("D")
Finally
Console.Write("E")
并将其与此示例进行比较:
' Outputs "ABDE" (does not output "C")
Console.Write("A")
Try
Console.Write("B")
Throw New Exception()
Console.Write("C")
Catch
Console.Write("D")
Finally
Console.Write("E")
有关该主题的更多信息,请参阅the MSDN article。