0

如果文件存在或在那一刻正在使用,我该如何创建新的 log1、log2、log3 等。现在,当我启动应用程序时,我无法启动第二个,因为日志文件正在使用中。我必须创建第二个日志文件或以某种方式写入同一个文件?

编辑:

这是适合我的解决方案。

if (String.IsNullOrEmpty(this.LogFile1))
            {
                string fn = "\\log.txt";
                while (File.Exists(fn))
                {
                    fn = "\\log1.txt";
                }
                this.LogFile1 = fn;
            }
            return this.LogFile1;

并对我的代码进行一些编辑:

 if (!File.Exists(this.LogFile))
            {
                log = new StreamWriter(this.LogFile);
            }

            else
            {
                log = File.AppendText(this.LogFile);
            }

现在,如果我有 log.txt 程序将创建新的 log1.txt。如果它们都存在将创建 log11.txt 等等。

4

6 回答 6

2

试试这个。这是我使用的,它工作正常

    StreamWriter sw;

  if (!File.Exists(path))
                    {

                        sw = File.CreateText(path);
                    }

                    else
                    {
                        sw = File.AppendText(path);

                    }

                    sw.WriteLine(ex.Message);
                    sw.Flush();
                    sw.Close();
于 2012-05-28T05:53:05.033 回答
2

你可以使用这个:

          if (String.IsNullOrEmpty(this.LogFile1))
            {
                string fn = "LogFile";
                while (File.Exists(fn))
                {
                    fn = fn + "1";
                }
                this.LogFile1 = fn;
            }
            return this.LogFile1;
于 2012-05-28T07:10:53.420 回答
1

编辑

如果你想记录信息比使用 log4net 更好

文章:log4net C# 代码片段


这是给你的代码

if (!File.Exists("\\log.txt")) 
{
   FileInfo fileinfo = new FileInfo("\\log.txt");
   if(IsFileinUse(fileinfo))
   {  
      //create new one 
      log = new StreamWriter("\\log.txt");
   }                
   else
   {
     log = File.AppendText("\\log.txt");
   }

///检查文件是否在使用中......

protected virtual bool IsFileinUse(FileInfo file)
{
     FileStream stream = null;

     try
     {
         stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
     }
     catch (IOException)
     {
         //the file is unavailable because it is:
         //still being written to
         //or being processed by another thread
         //or does not exist (has already been processed)
         return true;
     }
     finally
     {
         if (stream != null)
         stream.Close();
     }
     return false; 
}
于 2012-05-28T05:55:26.210 回答
1

我通过在我的项目中添加 try/catch 来处理这个问题

try
{
   using (Stream stream = new FileStream(@"\log.txt", FileMode.Open))
   {
      //Write to your log file here
   }
} 
catch (Exception ex)
{
   //you can check here why it failed
}

在 catch 方法中,您可以使用 ex.Message 和 if 语句来处理它。例如...这里的 MyError 将是 I/O 文件不存在或文件正在使用,但您可以自己轻松测试

请注意,在下面的代码片段中,您将在名称中包含日期的同一位置创建一个新的日志文件。这样您就可以确定具有唯一的文件名,并且如果您正在搜索问题,则可以轻松浏览日志文件。

if (ex.Message == "MyError")
{
   string filename = String.Format("{1}_{0:yyyy-MM-dd}", @"log", DateTime.Now);
   string fullpath = Path.Combine(@"\",filename);
   using (StreamWriter sw = File.CreateText(path))
   {
      //This is where you will write your text to the new file if the other one was in use
      sw.WriteLine("something....");
   }
}

编辑:

有关可以在异常处理中使用的文件处理异常,请参见此处,使用异常处理将确保您的应用程序不会崩溃。

http://msdn.microsoft.com/en-us/library/system.io.filenotfoundexception(v=vs.71).aspx

希望这可以帮助。

干杯,凯文

于 2012-05-28T15:48:34.927 回答
1

你以错误的方式解决问题;与其尝试发明自己的方法来创建新文件,不如使用现有的库(如 NLog 或 log4net)为您完成,它已经解决了并发访问和其他注意事项的所有问题。

我也不知道 log4net,但是对于 NLog,你可以这样做(log4net 应该类似):

1) 下载 NLog,将其作为参考添加到您的项目中

2) 通过创建 NLog.config 并将其设置为在构建时复制到输出文件夹来配置 NLog。这是一个简单的配置文件,如果文件太大,它将简单地登录到当前目录并存档:

<?xml version="1.0" encoding="utf-8"?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true">
    <targets>
        <target name="targetFile" xsi:type="File" fileName="log.txt" archiveAboveSize="1000000" archiveNumbering="Sequence" />
    </targets>

    <rules>
        <logger name="*" minlevel="Trace" writeTo="targetFile" />
    </rules>
</nlog>

3)将此添加到您的类属性(以及您要记录的任何其他位置):

private readonly Logger logger = LogManager.GetCurrentClassLogger();

然后,任何时候您想登录,只需执行以下操作:

logger.Info(responseFromServer);

编辑

在我的测试中,NLog 使用的并发写入算法可能会在消息过多的情况下丢弃消息,并且它必须争夺对文件的访问权限(但是,它不会抛出异常)。如果您想通过在配置文件中插入 ${processid} 来确保永远不会丢失消息,您可以将每个进程记录到自己的文件中,用于日志位置,如下所示:

<target name="targetFile" xsi:type="File" fileName="log_${processid}.txt" archiveAboveSize="1000000" archiveNumbering="Sequence" />
于 2012-05-28T21:00:24.100 回答
-1
Dim logFile As StreamWriter
If File.Exists(("C:\Logs\log1.txt")) Then    
    logFile = File.AppendText("C:\Logs\log1.txt")    
Else    
    logFile = File.CreateText("C:\Logs\log1.txt")    
End If
于 2012-05-28T05:56:24.397 回答