C# 检查创建新c时文件是否存在#

C# 检查创建新c时文件是否存在#,c#,winforms,file,C#,Winforms,File,如何确定文件是否存在或正在使用,以创建新的log1、log2、log3等。 现在,当我启动应用程序时,我无法启动第二个,因为日志文件正在使用中。我必须创建第二个日志文件,还是以某种方式写入同一个文件 编辑: 这是一个适合我的解决方案 if (String.IsNullOrEmpty(this.LogFile1)) { string fn = "\\log.txt"; while (File.Exists(fn

如何确定文件是否存在或正在使用,以创建新的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等等。

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

    StreamWriter sw;

  if (!File.Exists(path))
                    {

                        sw = File.CreateText(path);
                    }

                    else
                    {
                        sw = File.AppendText(path);

                    }

                    sw.WriteLine(ex.Message);
                    sw.Flush();
                    sw.Close();

试试这个。这是我用的,效果很好

    StreamWriter sw;

  if (!File.Exists(path))
                    {

                        sw = File.CreateText(path);
                    }

                    else
                    {
                        sw = File.AppendText(path);

                    }

                    sw.WriteLine(ex.Message);
                    sw.Flush();
                    sw.Close();
编辑

如果您想记录信息,最好使用log4net

第条:


这是你的代码

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; 
}
编辑

如果您想记录信息,最好使用log4net

第条:


这是你的代码

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; 
}
您可以使用以下选项:

          if (String.IsNullOrEmpty(this.LogFile1))
            {
                string fn = "LogFile";
                while (File.Exists(fn))
                {
                    fn = fn + "1";
                }
                this.LogFile1 = fn;
            }
            return this.LogFile1;
您可以使用以下选项:

          if (String.IsNullOrEmpty(this.LogFile1))
            {
                string fn = "LogFile";
                while (File.Exists(fn))
                {
                    fn = fn + "1";
                }
                this.LogFile1 = fn;
            }
            return this.LogFile1;

我通过在项目中添加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语句来处理它。 例如我的错误是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....");
   }
}
编辑:

请参阅此处,了解可在异常处理中使用的文件处理异常,使用异常处理将确保应用程序不会崩溃

希望这有帮助

干杯,
凯文

我通过在我的项目中添加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语句来处理它。 例如我的错误是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....");
   }
}
编辑:

请参阅此处,了解可在异常处理中使用的文件处理异常,使用异常处理将确保应用程序不会崩溃

希望这有帮助

干杯,
凯文

你处理问题的方式不对;与其尝试发明自己的方法来创建新文件,不如简单地使用现有的库(如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>
然后,无论何时您想要登录,只需执行以下操作:

logger.Info(responseFromServer);
编辑

在我的测试中,NLog使用的并发写入算法可能会丢弃消息,如果一次出现的消息太多,它必须争取访问该文件(但是,它不会抛出异常)。如果要确保消息永不丢失,可以通过在配置文件中为日志位置插入${processid},将每个进程日志保存到自己的文件中,如下所示:

<target name="targetFile" xsi:type="File" fileName="log_${processid}.txt" archiveAboveSize="1000000" archiveNumbering="Sequence" />

你处理问题的方式不对;与其尝试发明自己的方法来创建新文件,不如简单地使用现有的库(如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>
然后,无论何时您想要登录,只需执行以下操作:

logger.Info(responseFromServer);
编辑

在我的测试中,NLog使用的并发写入算法可能会丢弃消息,如果一次出现的消息太多,它必须争取访问该文件(但是,它不会抛出异常)。如果要确保消息永不丢失,可以通过在配置文件中为日志位置插入${processid},将每个进程日志保存到自己的文件中,如下所示:

<target name="targetFile" xsi:type="File" fileName="log_${processid}.txt" archiveAboveSize="1000000" archiveNumbering="Sequence" />



对于文件存在,请检查您的代码是否有效,为了检查是否正在使用文件,请考虑使用Nlog或另一个日志框架来处理所有这些东西。您可以使用它。如果您得到了所需的信息,请不要忘记将答案标记为“接受”。如果您不解释为什么,那么向下投票的要点是什么?对于文件存在,检查您的代码将工作,为了检查是否正在使用文件,请考虑使用Nlog或另一个日志框架来处理所有这些东西。您可以使用它。如果您得到了所需的信息,请不要忘记将答案标记为“接受”。如果您不解释为什么,那么向下投票的要点是什么?@ SHIPLU.MOKADAD.IM -我使用它来检查文件是否打开……如果你知道其他检查方法,请让我知道。。。thanks@PranayRana和您的代码正在工作(不会崩溃),但只在日志的第一行写入,然后就什么都没有了…您知道为什么会这样吗?@shiplu.mokadd.im-等待您的回复…如果您没有,请删除您的否决票…@Pranay Rana Ok,现在正在使用这两个程序工作并在日志文件中写入,但有时会出现错误框和wh