繁体   English   中英

VB.NET 在继续读/写之前检查文件是否打开?

[英]VB.NET Checking if a File is Open before proceeding with a Read/Write?

有没有办法验证文件是否打开? 我唯一能想到的是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

任何指针将不胜感激! 谢谢!!

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

像这样调用它:

Call IsFileOpen(new FileInfo(filePath))

使用“正在使用的文件检查”功能确实没有意义,因为您仍然需要 try catch 来处理文件无法打开的情况。 文件打开失败的原因不仅仅是它已经打开了。

同样使用函数进行检查并不能保证成功。 'is file in use check' 可能仅在文件打开失败并出现文件已打开错误时返回 false,因为在检查和尝试打开文件之间的时间已被其他人打开。

看起来来自这个MSDN 论坛帖子的两个建议都涉及尝试打开文件。

第一个与您现在正在执行的操作类似,第二个涉及使用 Windows API 函数 (CreateFile) 并检查表示文件正在使用中的无效句柄。 在这两种情况下,他们都依赖错误条件来确定文件是否打开。 简而言之,我认为您使用的方法是正确的,因为没有System.IO.File.IsOpen 属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM