检查文件是否被可执行程序运行的其他实例使用
本文关键字:其他 实例 运行 文件 是否 可执行程序 检查 | 更新日期: 2023-09-27 18:25:08
在详细介绍之前,我的程序是在Visual Studio 2010中使用C#.Net 4.0编写的。
我编写了一个程序,它将为每次运行生成单独的日志文件。日志文件以时间命名,精确到毫秒(例如,20130726103042375.log)。如果还不存在,程序还会生成当天的主日志文件(例如,*20130726_master.log*)
在每次运行结束时,我希望将日志文件附加到主日志文件中。有没有一种方法可以检查我是否可以成功附加?在Sleep
之后重试大约一秒钟?
基本上,我有1个可执行文件和多个用户(假设有5个用户)。
所有5个用户将同时访问和运行此可执行文件。由于几乎不可能让所有用户都在同一时间(最多毫秒)启动,因此生成单个日志文件不会有问题。
但是,当我尝试将这些日志文件合并到主日志文件时,就会出现这个问题。虽然不太可能,但我认为如果多个用户附加到同一个主日志文件,程序会崩溃。
我使用的方法是
File.AppendAllText(masterLogFile, File.ReadAllText(individualLogFile));
我已经检查了lock
对象,但我认为它在我的情况下不起作用,因为有多个实例在运行,而不是在一个实例中运行多个线程。
我研究的另一种方法是try/catch
,类似于这个
try
{
stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch {}
但我认为这并不能解决问题,因为master LogFile的状态可能会在短短的几毫秒内发生变化。
所以我的总体问题是:如果masterLogFile未使用,是否有方法附加到它,如果使用,则在短时间超时后重试?或者是否有其他方法可以创建master日志文件?
提前谢谢你,很抱歉收到这么长的信息。我想确保我能传达我的信息,并解释我所尝试或调查的内容,这样我们就不会浪费任何人的时间。
请告诉我是否还有我可以提供的信息来帮助你。
你的try/catch是做事的方法。如果对File.Open
的调用成功,则可以向文件写入。这个想法是保持文件打开。我建议:
bool openSuccessful = false;
while (!openSuccessful)
{
try
{
using (var writer = new StreamWriter(masterlog, true)) // append
{
// successfully opened file
openSuccessful = true;
try
{
foreach (var line in File.ReadLines(individualLogFile))
{
writer.WriteLine(line);
}
}
catch (exceptions that occur while writing)
{
// something unexpected happened.
// handle the error and exit the loop.
break;
}
}
}
catch (exceptions that occur when trying to open the file)
{
// couldn't open the file.
// If the exception is because it's opened in another process,
// then delay and retry.
// Otherwise exit.
Sleep(1000);
}
}
if (!openSuccessful)
{
// notify of error
}
因此,如果您无法打开文件,请先休眠,然后再试一次。
请参阅我的博客文章File.Exists只是一个快照,了解更多细节。
我会按照这一点做一些事情,因为我认为这会带来最少的开销。如果抛出异常,Try/catch将生成堆栈跟踪(可能需要整整一秒钟)。必须有一种更好的方法来做到这一点。如果我找到一个,我会发布它。