我有一个日志文件已打开并被另一个程序使用,我用以下内容阅读了它的内容:
Dim strContents As String
Dim x As New FileStream(FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
Dim objReader As StreamReader
objReader = New StreamReader(x)
strContents = objReader.ReadToEnd()
objReader.Close()
这适用于从文件中读取其他程序仍在使用的文本,但是,在此之后我需要截断文本文件(不删除它),以便它再次为空。但该文件仍将被其他程序使用。
我试过
Dim sWrite As StreamWriter
sWrite = New System.IO.StreamWriter(FullPath, False)
sWrite.Write("")
sWrite.Close()
但是我得到了“另一个应用程序正在使用”的例外情况。我试过看StackOverflow和谷歌搜索,但我似乎无法找到答案,我找不到用文件流做这个的方法,或者我会尝试使用
Dim fs As New FileStream(FullPath, FileMode.Open, FileAccess.Write, FileShare.ReadWrite)
提前致谢。
答案 0 :(得分:1)
此主题还有其他一些帖子。
Detecting whether a file is locked by another process (or indeed the same process)
Can I simply 'read' a file that is in use?
解决方案似乎是:
Try
'Code to read file if its not locked by another app
Catch as System.IO.IOException
同样只是一个FYI,您的日志文件是非托管资源,因此确定性的最终确定将有助于解决此资源争用问题。使用Using语句进行确定性终结,例如:
Using fs = New FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)
fs.SetLength(0)
file.Save(fs)
fs.Flush()
End Using
答案 1 :(得分:0)
这是因为其他程序锁定了文件,操作系统不会让你做你想做的事情。除非您将其他程序更改为无法写入锁定。
答案 2 :(得分:0)
不幸的是,无论使用何种语言,问题的解决方案都不像添加或修改几行代码那么简单。您正在描述resource contention的经典示例。
这种类型的问题最好使用访问管理器解决,即另一个仲裁写入的进程,使您的程序不会覆盖其他程序所做的事情,反之亦然。
答案 3 :(得分:0)
我不确定在其他进程关闭流之前是否可以这样做。但是,您可以终止写入文件的进程。
这是一个例子。
Dim pProcess() As Process = System.Diagnostics.Process.GetProcessesByName("notepad")
For Each p As Process In pProcess
p.Kill()
Next
检查出来:http://vbnetsample.blogspot.com/2007/08/start-and-kill-process.html