是否有方法可以验证文件是否已打开?我唯一能想到的是Try/Catch
,看看我是否可以捕获文件打开异常,但我认为如果文件打开,我可以使用一个方法返回true / false。
目前在名为System.IO
的类下面使用Wallet
和以下代码。
Private holdPath As String = "defaultLog.txt"
Private _file As New FileStream(holdPath, FileMode.OpenOrCreate, FileAccess.ReadWrite)
Private file As New StreamWriter(_file)
Public Function Check(ByVal CheckNumber As Integer, ByVal CheckAmount As Decimal) As Decimal
Try
file.WriteLine("testing")
file.Close()
Catch e As IOException
'Note sure if this is the proper way.
End Try
Return 0D
End Function
任何指针都将不胜感激!谢谢!!
答案 0 :(得分:15)
Private Sub IsFileOpen(ByVal file As FileInfo)
Dim stream As FileStream = Nothing
Try
stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None)
stream.Close()
Catch ex As Exception
If TypeOf ex Is IOException AndAlso IsFileLocked(ex) Then
' do something here, either close the file if you have a handle, show a msgbox, retry or as a last resort terminate the process - which could cause corruption and lose data
End If
End Try
End Sub
Private Shared Function IsFileLocked(exception As Exception) As Boolean
Dim errorCode As Integer = Marshal.GetHRForException(exception) And ((1 << 16) - 1)
Return errorCode = 32 OrElse errorCode = 33
End Function
答案 1 :(得分:6)
使用'is file in use check'功能确实没有意义,因为您仍然需要尝试catch来处理文件无法打开的情况。打开文件可能会失败的原因多于它刚刚打开的原因。
同样使用功能进行检查并不能保证成功。 “正在使用文件检查”可能仅对文件已打开错误的文件打开时返回false,因为在检查和尝试打开文件之间的时间是由其他人打开的。
答案 2 :(得分:2)
看起来这个MSDN forum posting的两个建议都涉及尝试打开文件。
第一个类似于您现在正在执行的操作,第二个涉及使用Windows API函数(CreateFile)并检查表示文件正在使用的无效句柄。在这两种情况下,他们都依赖于错误条件来确定文件是否打开。简而言之,在我看来,您使用的方法是正确的,因为不是System.IO.File.IsOpen属性。