Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查可执行文件运行的其他实例是否正在使用该文件_C#_.net_Io_File In Use - Fatal编程技术网

C# 检查可执行文件运行的其他实例是否正在使用该文件

C# 检查可执行文件运行的其他实例是否正在使用该文件,c#,.net,io,file-in-use,C#,.net,Io,File In Use,在详细介绍之前,我的程序是在VisualStudio2010中使用C#.NET4.0编写的 我编写了一个程序,将为每次运行生成单独的日志文件。日志文件以时间命名,精确到毫秒(例如20130726103042375.log)。如果尚未存在主日志文件(例如,*20130726_master.log*),则程序还将生成当天的主日志文件 在每次运行结束时,我想将日志文件附加到主日志文件中。有没有办法检查我是否可以成功追加?然后在睡眠一秒钟后重试 基本上,我有1个可执行文件和多个用户(假设有5个用户) 所

在详细介绍之前,我的程序是在VisualStudio2010中使用C#.NET4.0编写的

我编写了一个程序,将为每次运行生成单独的日志文件。日志文件以时间命名,精确到毫秒(例如20130726103042375.log)。如果尚未存在主日志文件(例如,*20130726_master.log*),则程序还将生成当天的主日志文件

在每次运行结束时,我想将日志文件附加到主日志文件中。有没有办法检查我是否可以成功追加?然后在
睡眠
一秒钟后重试

基本上,我有1个可执行文件和多个用户(假设有5个用户)

所有5个用户将同时访问并运行此可执行文件。由于几乎不可能所有用户都在同一时间启动(高达毫秒),因此生成单个日志文件不会有问题

但是,当我尝试将这些日志文件合并到主日志文件时,问题就出现了。虽然不太可能,但我认为如果多个用户附加到同一主日志文件,程序将崩溃

我使用的方法是

File.AppendAllText(masterLogFile, File.ReadAllText(individualLogFile));
我已经检查了
lock
对象,但我认为它在我的情况下不起作用,因为有多个实例在运行,而不是一个实例中有多个线程

我研究的另一种方法是
try/catch
,类似这样

try
{
    stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
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
}
因此,如果无法打开该文件,请休眠并重试


请参阅我的博客文章,了解更多细节。

我会按照我认为开销最小的原则做一些事情。如果抛出异常,Try/catch将生成堆栈跟踪(可能需要整整一秒钟)。必须有更好的方法在原子上实现这一点。如果我找到一个,我会发布。

这可能会有帮助:如果我将整个try/catch放在一个while循环中,在到达外部尝试结束时中断,并在外部catch中睡眠,那么我会得到预期的结果吗?我将该方法放在模式代码中,它没有给出编译错误,但正如我所说,这种情况很少发生,只是担心在我不知道的情况下它会中断。@sora0419:请参阅我更新的代码示例。关键是要正确处理异常。此解决方案设计不佳。至少在文件锁定方面,他应该寻找一个特殊的例外。该文件甚至可能不存在,或者访问可能被拒绝,等等。但这段代码将使您处于一个无止境、盲目、低效的过山车上。@user1132959,请参阅异常处理程序中的注释。我特别建议检查异常类型并采取相应措施。@JimMischel请指定这些异常。答案是不完整的。首先,“整整一秒钟”在这种情况下根本不是时间。他在读写大文件。另一个过程可能会使该文件打开的时间远远超过“一整秒钟”,因此担心这一时间是荒谬的。其次,链接中的技术是愚蠢的,因为他只是用复杂的代码来替换一个简单有效的异常处理程序,该代码在.NET运行时进行结束运行,并且在这个过程中没有提供任何特殊的好处。@JimMischel“一整秒”对于一些应该需要几毫秒的事情来说是很长的时间。你的尝试/捕获永远不会成功。如果有1000个进程试图访问它,您的性能将受到影响。所以担心那段时间并不是“荒谬的”,只是不无知而已。仅仅用异常处理程序包围它是盲目的和“愚蠢的”。整个目的是等待独占访问,那么为什么不高效、正确地执行呢?在允许错误发生之前检查错误要比捕获错误并忽略它(这需要一秒钟)好得多。如果有1000个甚至100个进程在竞争文件的独占锁,那么问题会大得多。任何依赖独占访问的解决方案都无法扩展。即使链接的解决方案也会遇到错误。它只是以不同的方式处理错误。无论哪种方式,链接都具有更好的、更易于维护的设计,并且工作效率更高。从这个意义上讲,它的规模将“更好”,但当然不是完美的。