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))
应该是注释而不是答案