[英]Check If File Is In Use By Other Instances of Executable Run
在我太详细之前,我的程序是使用C#.Net 4.0在Visual Studio 2010中编写的。
我编写了一个程序,该程序将为每次运行生成单独的日志文件。 日志文件以时间命名,并且精确到毫秒(例如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 {}
但是我认为这不能解决问题,因为masterLogFile的状态可以在短时间内改变。
因此,我的总体问题是:是否有一种方法可以在未使用masterLogFile的情况下追加它,并在短时超时后重试? 还是如果有其他方法可以创建masterLogFile?
在此先感谢您,很长的信息对不起。 我想确保我能传达我的信息并解释我尝试过或研究过的内容,以免浪费任何人的时间。
如果有更多信息可以帮助您,请告诉我。
尝试/捕获是做事的方式。 如果对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将生成堆栈跟踪(可能需要一整秒钟)。 必须有一种更好的方法来自动执行此操作。 如果找到一个,我将其发布。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.