【问题标题】:Write to a file that is being used by another process (Windows Service) in C#在 C# 中写入另一个进程(Windows 服务)正在使用的文件
【发布时间】:2012-08-19 14:06:24
【问题描述】:

有什么方法可以写入另一个进程正在使用的文件?我有一个 Windows 服务,它创建日志并锁定文件,直到服务停止。我有另一个程序可以备份文本文件的内容并清除原始文件。当我尝试使用我的 C# 程序备份并清除我的其他服务正在使用的日志时,它生成了一个错误:“该进程无法访问该文件,因为它正被另一个进程使用”..

我一直在搜索并且知道如果文件被锁定,您必须检查它,然后等待它直到它没有被另一个程序使用。我需要一个能够写入锁定文件的代码。这可能吗?

这是我每 3 分钟记录到文件的示例 Windows 服务代码:

private Timer timer = new Timer();
private static FileStream fs = new FileStream(@"D:\Hello.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
private StreamWriter sw = new StreamWriter(fs);

protected override void OnStart(string[] args)
{
    timer.Elapsed += new ElapsedEventHandler(WriteText);
    timer.Interval = 50000; //5 minutes
    timer.Start();
}
public void WriteText(object source, ElapsedEventArgs e)
{
    sw.WriteLine(DateTime.Now);
}
protected override void OnStop()
{
    sw.Close();
    sw.Dispose();
    fs.Close();
    fs.Dispose();   
}

除非服务停止,否则我必须不关闭流。

【问题讨论】:

  • 我已经更新了代码。谢谢
  • @ 0_______0。是的,我已经这样做了,两者都有 fileaccess.write。问题是,文件被锁定,直到服务停止。
  • 回复:“除非服务停止,否则我必须不关闭流。”您收到了相互矛盾的要求。除非服务关闭流并移至另一个文件,否则您无法删除或截断旧文件。满足上述要求的唯一可能性是服务本身停止写入片刻(缓冲任何中间写入),备份文件内容,将文件清零,然后重新开始写入。跨度>

标签: c# file windows-services stream file-permissions


【解决方案1】:

您是否被束缚在使用 StreamWriter 上?您可能想考虑使用 log4net 之类的东西进行日志记录。您可以将其配置为滚动日志并从那里进行备份,或者只是将其用作备份。

【讨论】:

  • 是的,我不能使用任何第三方程序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多