2016-09-14 66 views
0

有很多解释如何清空日志文件。清除C#中锁定的日志文件的内容

像:

File.WriteAllText(activeTab.FileName, string.Empty); 

但是这个例子和其他的例子,我发现所有有同样的问题。如果日志文件当前被另一个进程锁定,则它不起作用。

在ruby中有一个任务我可以使用​​不删除,只是清空日志文件。

我发现我也可以用Powershell使用clc <filename>。 来源可现在这里:

https://github.com/PowerShell/PowerShell/blob/c1faf1e6e10fc1ce45e84ef6f49ae7136c67a111/src/Microsoft.PowerShell.Commands.Management/commands/management/ClearContentCommand.cs

但老实说,我不明白这个代码是如何工作的,也从其他类继承。

是否有可用于任何常用程序/类的C#实现?

+0

总之,如果一个文件被锁定你(*您=任何其他进程/线程*)不能删除或修改(“空”)它。有很多第三方日志库,我会推荐任何一天试图推出自己的。然后使用一个库将确保你不必担心这样的事情,因为这些库中的一些已经存在了,只要我记得,并且非常强大和可配置。我个人最喜欢的是[Log4Net](https://logging.apache.org/log4net/),但[NLog](http://nlog-project.org/)也很受欢迎。 – Igor

+1

IMO,这不是一个合理/安全的事情。你应该弄清楚如何让任何人拿着文件锁释放它。 – jlew

+0

您不能破坏另一个进程的文件锁定。你所能做的就是将数据排队到某个地方,并且继续检查要释放的锁,然后完成你的动作(编辑/删除/清除)。 –

回答

0

原来,该文件可以在我的情况下,使用这段代码清除:

var stream = new FileStream(FileName, FileMode.Truncate, FileAccess.ReadWrite, FileShare.ReadWrite | FileShare.Delete); 
    stream.Close(); 
+1

似乎与大多数托管代码工具(包括PowerShell)在打开文件时省略“FileShare.Delete”选项有关。较旧的本地代码应用程序通常会打开带有共享/删除功能的文件。这是我喜欢旧方式更好的情况之一。 –