0

ファイルが存在するか、その瞬間に使用されている場合、新しいログ1、ログ2、ログ3などを作成するにはどうすればよいですか。ログフ​​ァイルが使用されているため、アプリを起動すると2番目に起動できません。2 番目のログ ファイルを作成するか、何らかの方法で同じファイルに書き込む必要がありますか?

編集:

ここに私にとってうまくいく解決策があります。

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

これを使用できます:

          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 に答える
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 に答える
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

編集

情報をログに記録したい場合は、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
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 に答える