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

VB.NET在继续读/写之前检查文件是否打开?,vb.net,winforms,visual-studio-2010,Vb.net,Winforms,Visual Studio 2010,是否有方法验证文件是否已打开?我能想到的唯一一件事就是使用Try/Catch查看是否可以捕获文件打开异常,但我认为如果文件打开,可以使用一种方法返回true/false 当前正在使用System.IO和名为Wallet的类下的以下代码 Private holdPath As String = "defaultLog.txt" Private _file As New FileStream(holdPath, FileMode.OpenOrCreate, FileAccess.Re

是否有方法验证文件是否已打开?我能想到的唯一一件事就是使用
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

任何提示都将不胜感激!谢谢

这两个建议似乎都涉及到试图打开文件

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

Private Sub IsFileOpen(ByVal File As FileInfo)
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
将流设置为文件流=无 尝试 stream=file.Open(FileMode.Open、FileAccess.ReadWrite、FileShare.None) stream.Close() 特例 如果TypeOf ex是IOException,并且也是filelocked(ex),那么 '在此处执行操作,或者关闭文件(如果有句柄)、显示msgbox、重试,或者作为最后手段终止该进程,这可能会导致损坏和数据丢失 如果结束 结束尝试 端接头 私有共享函数IsFileLocked(异常为异常)为布尔值
Dim errorCode As Integer=Marshal.GetHRForException(异常)和((1使用“正在使用的文件检查”函数实际上没有意义,因为您仍然需要使用try-catch来处理文件无法打开的情况。文件打开失败的原因可能比已经打开的原因更多


此外,使用函数执行检查也不能保证成功。“正在使用的文件检查”可能只在文件打开失败且出现文件已打开错误时返回false,因为在检查和尝试打开文件之间,文件是由其他人打开的。

处理文件。GetLastAccessTime()也许?没有直接的方法来检测文件是否被打开。这是我问过的问题,也得到了答案,所以没有办法真正知道文件当前是否被打开?即使是在VS 2010中?嗨,马克,我相信你知道,在StackOverflow回答中,通常会包括一个链接内容的摘要或特别回答t的突出部分他提出了一个问题。SE站点的目标是在未来几年内成为一个知识和答案的资源。对于只有链接的答案,op必须挖掘另一个资源来找到他/她可能不确定的答案。最重要的是,如果你的链接断开,你的答案对将来访问此页面的任何人都是无用的。干杯对于链接tho!@JeremyThompson,我意识到了这一点,我也意识到了。在这种情况下,我有意识地决定不粘贴任何代码。我并不是想说这是正确的做法。我只是想让OP放心,他这样做是正确的,IMHO。建议他使用WinApi不是我想做的,在t他的案子太过火了。谢谢你,马克,我很感激你的回答,我也同意你的回答太过火了,但这确实让我对这个问题有了一个很好的看法!再次感谢:)很好的解决方案。我想补充一点,你需要确保流式处理。关闭()如果没有异常,则程序可以继续运行而不会出现问题。它表示未声明封送。@CaryBondoc
导入System.Runtime.InteropServices;
以修复封送未声明的问题。提示:
封送
将有一条蓝色小下划线,将鼠标悬停在该下划线上,它将提示您什么是wrong!谢谢!它成功了。请您详细说明一下如何使用代码@Jeremythonpson。现在它说,
类型为“String”的值不能转换为“System.IO.FileInfo”。
调用IsFileOpen(new FileInfo(filePath))
应该是注释而不是答案