如何附加到“ dotnet”正在使用的文件中

时间:2019-05-22 12:52:48

标签: c# visual-studio file process

当我开始在控制台应用程序上捕获并显示日志记录异常时,我意识到由于以下错误,我的许多日志消息都不存在

  

该进程无法访问文件'[MY_LOG_FILE_PATH]',因为它是   被另一个进程使用

这是我将消息记录在日志文件中的方式(我会在应用程序的每次运行中创建一个新文件)。变量callingClasscallingMethod分别是调用Log函数的类和方法。

try
{
    var stackTrace = new StackTrace();
    string callingMethod = stackTrace.GetFrame(1).GetMethod().Name;
    string callingClass = stackTrace.GetFrame(1).GetMethod().ReflectedType.Name;
    string logText = string.Format(format, DateTime.Now, "INFO", callingClass, callingMethod, message);
    if (!Directory.Exists("log"))
        Directory.CreateDirectory("log");
    if (!File.Exists(logFilePath))
        File.Create(logFilePath);
    using (FileStream f = new FileStream(logFilePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
    using (StreamWriter sw = new StreamWriter(f))
        sw.WriteLine(logText);
}
catch(IOException)
{
    Console.WriteLine("Processes locking the file:");
    var lockingProcesses = FileHelper.WhoIsLocking(logFilePath);
    foreach (Process p in lockingProcesses)
        Console.WriteLine("Process: " + p.ProcessName + "   Machine:" + p.MachineName);
}
catch (Exception ex)
{
    Console.ForegroundColor = ConsoleColor.DarkRed;
    Console.WriteLine("The following log could not be written to file: " + message);
    Console.WriteLine("Error: " + ex.Message);
    Console.ResetColor();
}

当我发现IOException导致上述情况时,我发现拥有日志文件的进程是“ dotnet” 驻留在计算机上。” / strong>,我认为这是当前计算机。

如何不丢失日志消息?

IDE :Visual Studio Community 2019版本16.0.4

.NET Framework版本:4.7.03190

操作系统:Windows 10 Pro 64x

2 个答案:

答案 0 :(得分:1)

File.Create创建并打开文件。因此,在下一行中,当您尝试创建新的FileStream时,文件已打开并引发错误。

一种选择是在创建文件流时立即调用Close

File.Create(logFilePath).Close();

另一种方法是仅使用StreamWriter打开/创建文件,然后完全跳过使用FileStream。传递true意味着附加到文件(如果存在)。

try
{
    var stackTrace = new StackTrace();
    string callingMethod = stackTrace.GetFrame(1).GetMethod().Name;
    string callingClass = stackTrace.GetFrame(1).GetMethod().ReflectedType.Name;
    string logText = string.Format(format, DateTime.Now, "INFO", callingClass, callingMethod, message);

    if (!Directory.Exists("log"))
        Directory.CreateDirectory("log");

    using (var sw = new StreamWriter(logFilePath, true))
    {
        sw.WriteLine(logText);
    } 
}
catch(IOException)
{
    Console.WriteLine("Processes locking the file:");
    var lockingProcesses = FileHelper.WhoIsLocking(logFilePath);
    foreach (Process p in lockingProcesses)
        Console.WriteLine("Process: " + p.ProcessName + "   Machine:" + p.MachineName);
}
catch (Exception ex)
{
    Console.ForegroundColor = ConsoleColor.DarkRed;
    Console.WriteLine("The following log could not be written to file: " + message);
    Console.WriteLine("Error: " + ex.Message);
    Console.ResetColor();
}

答案 1 :(得分:0)

尝试将您的消息推送到共享的BlockingCollection中,并具有一个从中读取并写入日志文件的线程。