2

これは非常に簡単な修正であるはずですが、何らかの理由で何かが足りません。私がやろうとしているのは、ヘッダーを書かなければならない文字列ビルダー関数を取得することだけですが、何らかの理由で現在はそうではありません。

ifステートメントを!File.Exists(tempFileName)に変更しようとすると、ループが実行されません。

助言がありますか?また、さらに情報が必要な場合はお知らせください。前もって感謝します。

public static void Open(string tempFileName, string division,
                             int zipFiles, int conversions, int returnedFiles, int totalEmails)
    {
        StreamWriter dailyStats;

        //This is where I am missing something
        //I am passing in the original filename of a log, then adding "-Stats.log"
        //so I can tell the difference between what is the new stats file, and the original log file
        if (File.Exists(tempFileName))
        {
            dailyStats = new StreamWriter(tempFileName + "-Stats.log");

            StringBuilder sb = new StringBuilder();
            sb.Append("Division");
            sb.Append("\t");
            sb.Append("Zip Files");
            sb.Append("\t");
            sb.Append("Conversions");
            sb.Append("\t");
            sb.Append("Returned Files");
            sb.Append("\t");
            sb.Append("Total E-Mails");
            sb.Append("\t");

        }
        else
        {
            dailyStats = File.AppendText(tempFileName + "-Stats.log");
        }

        if (writeLog)
        {
            //Use a string builder to assemble the content for performance reasons
            StringBuilder s = new StringBuilder();
            s.Append(division);
            s.Append("\t");
            s.Append(zipFiles);
            s.Append("\t");
            s.Append(conversions);
            s.Append("\t");
            s.Append(returnedFiles);
            s.Append("\t");
            s.Append(totalEmails);
            s.Append("\t");

            dailyStats.WriteLine(s.ToString());
        }

        dailyStats.Close();
    }
4

3 に答える 3

5

最初のブロックにコードがありませんか?:

dailyStats.WriteLine(sb.ToString());

したがって:

    if (File.Exists(tempFileName))
    {
        dailyStats = new StreamWriter(tempFileName + "-Stats.log");

        StringBuilder sb = new StringBuilder();
        sb.Append("Division");
        sb.Append("\t");
        sb.Append("Zip Files");
        sb.Append("\t");
        sb.Append("Conversions");
        sb.Append("\t");
        sb.Append("Returned Files");
        sb.Append("\t");
        sb.Append("Total E-Mails");
        sb.Append("\t");

        // Add this ......
        dailyStats.WriteLine(sb.ToString());
    }
于 2012-04-24T14:21:50.953 に答える
1

このように修正できます

var sb = new StringBuilder();
string logFileName = tempFileName + "-Stats.log";
if (File.Exists(logFileName)) {
    dailyStats = File.AppendText(logFileName); 
} else {
    dailyStats = new StreamWriter(logFileName); 

    // Write header
    sb.Append("Division");
    ...
    sb.AppendLine();
} 

if (writeLog)  {
    sb.Append(division);
    ...
    dailyStats.WriteLine(sb.ToString());
} 
dailyStats.Close();

アップデート

コードにはさまざまなエラーがありました。2 つStringBuilders作成されましたが、ファイルに書き込まれたのは 1 つだけです。ファイルの存在は、書き込まれた実際のファイルとは異なるファイル名に対して判別されました。そして最後に、ファイルの存在に依存するロジックが反転されました。より理解しやすく管理しやすいものにするために、コードを完全に書き直してリファクタリングしました

public static void Open(string tempFileName, string division,
                     int zipFiles, int conversions, int returnedFiles, int totalEmails)
{
    if (!writeLog)
        return;

    using (StreamWriter dailyStats = OpenLogFile(tempFileName)) {
        var sb = new StringBuilder();
        sb.Append(division);
        // ...
        dailyStats.WriteLine(sb.ToString());
    }
}

private static StreamWriter OpenLogFile(string tempFileName)
{
    StreamWriter dailyStats;
    string logFileName = tempFileName + "-Stats.log";
    if (File.Exists(logFileName)) {
        dailyStats = File.AppendText(logFileName);
    } else {
        dailyStats = new StreamWriter(logFileName);
        WriteHeader(dailyStats);
    }
    return dailyStats;
}

private static void WriteHeader(StreamWriter dailyStats)
{
    var sb = new StringBuilder();
    sb.Append("Division");
    // ...
    dailyStats.WriteLine(sb.ToString());
}

注: using ステートメントはファイルを閉じ、外部リソースを自動的に解放します。

于 2012-04-24T14:30:16.690 に答える
0

あなたは秒StringBuilderを作成していて、それに対して何もしていません。StringBuilderいずれかのブロックにすべて追加すると、最後に書き出すことができる 1 つの SB に追加されるように、より高いレベルで を定義するだけでよいでしょう。

もちろん、他のオプションは、文字列を追加した後に何もしないのではなくStringBuilder、ヘッダーの書き込みに使用されたの内容を書き出すことです。dailyStats

于 2012-04-24T14:21:09.430 に答える