覆盖另一个进程正在使用的文本文件?

时间:2010-12-10 00:48:42

标签: c# .net vb.net file process

我有一个日志文件已打开并被另一个程序使用,我用以下内容阅读了它的内容:

    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)

提前致谢。

4 个答案:

答案 0 :(得分:1)

此主题还有其他一些帖子。

Detecting whether a file is locked by another process (or indeed the same process)

How to check for file lock?

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