2

簡単なロギング プロセスを使用するプログラムがあります。アイデアは、ファイルが既に存在しない限り、日付に対応する新しいファイルが毎日作成され、その場合は単に追加されるということです。問題は、File.Create が実行されるたびにエラーをスローしていることです。File.Create が FileStream を開いており、.close(); で呼び出すだけでよいという問題の解決策を見つけました。しかし、その解決策はうまくいきませんでした。ファイルが別のプロセスで使用されていることを示す IO 例外がまだ発生しています。これは、File.Create が作成するまで存在しないため、不可能です。ファイル。
コードは次のとおりです。

public static void logResults(System.Reflection.MethodBase method, Results result, string message)
    {
        string date = DateTime.Now.ToString();
        int index = date.IndexOf(" ");
        string subString = date.Substring(0, index);
        string nwDate = Regex.Replace(subString, "/", "");
        logFileName = "WebsiteRegressionProduction_TestCycle." + nwDate;
        string currentLogFile = logFileLocation + @"\" + logFileName;
        StringBuilder sb = new StringBuilder();
        if (!File.Exists(currentLogFile))
        {

            File.Create(currentLogFile).Close();
            sb.Append("DATE-TIME\tACTION\tTEST CLASS\tTEST NAME\tTEST STATUS\tERROR MESSAGES");
            sb.Append("\n");
        }
        else
        {
            string previousLogs = File.ReadAllText(currentLogFile);
            sb.Append(previousLogs);
        }
        sb.Append(DateTime.Now.ToString());
        sb.Append(" : ");
        sb.Append("Text Executed: ");
        sb.Append(method.ReflectedType.Name + " : ");
        sb.Append(method + " : ");
        sb.Append(result.ToString());
        sb.Append(" : ");
        sb.Append(message);
        sb.Append("\n");
        sb.Append("\n");

        File.WriteAllText(currentLogFile, sb.ToString());    
4

4 に答える 4

1

File.AppendTextは、達成しようとしているものにとっておそらくはるかに優れたオプションです。ファイルが見つからない場合はファイルを作成し、テキストを末尾に追加します。ファイルの先頭にヘッダーを追加する場合は、最初にファイルが存在するかどうかを手動で簡単に確認する必要があります。

于 2013-08-20T15:26:53.543 に答える
1

回答からの提案を使用して、コードを変更しました。ファイルを最初に作成するときに例外をスローしなくなりましたが、ファイルが既に使用されていてアクセスできなかったという理由で File.Create が IOException をスローした理由を誰かが説明できる場合は、回答を Accepted としてマークします。

        public static void logResults(System.Reflection.MethodBase method, Results result, string message)
    {
        string date = DateTime.Now.ToString();
        int index = date.IndexOf(" ");
        string subString = date.Substring(0, index);
        string nwDate = Regex.Replace(subString, "/", "");
        logFileName = "WebsiteRegressionProduction_TestCycle." + nwDate;
        string currentLogFile = logFileLocation + @"\" + logFileName;
        if (!File.Exists(currentLogFile))
        {
            File.WriteAllText(currentLogFile,
                "DATE-TIME\tACTION\tTEST CLASS\tTEST NAME\tTEST STATUS\tERROR MESSAGES\n\n", Encoding.ASCII);
        }
        var sb = new StringBuilder();
        sb.Append(String.Format("{0} : Test Executed: {1} : {2} : {3}\n\n", DateTime.Now.ToString(),
            method.ReflectedType.Name, method, message));
        using (var stream = File.AppendText(currentLogFile))
        {
            stream.Write(sb.ToString());
        }
    }
于 2013-08-20T16:09:59.817 に答える
0

1) 追加する前のコンテンツをすべて読むのはなぜですか? 2)「無料」ですべての作業を行うlog4netを使用するだけです

ただし、ストリームを使用して操作をより細かく制御することをお勧めします

FileStream fs = new FileStream(filePath, FileMode.Append);
            byte[] data = Encoding.ASCII.GetBytes("The string you wanna append");
            fs.Write(data, 0, data.Length);
            fs.Flush();
            fs.Close();

FileMode.Append は指定された (filePath) が存在する場合は Append で開き、存在しない場合は作成します。

于 2013-08-20T15:27:34.107 に答える
0

File.Create は FileStream を返すため、次のように FileStream オブジェクトを使用する必要があります。

FileStream fs = File.Create(currentLogFile);

次に、fs オブジェクトを使用してすべての読み取り/書き込みを行います。

于 2013-08-20T15:52:31.113 に答える