1

以下のコメントコードからわかるように、メッセージボックス内のフォルダにある各ファイルの名前とチェックサムを表示しようとしています。問題は、すべてを1つのウィンドウに表示するのではなく、ファイルごとに個別のメッセージボックスをポップアップ表示することです。MessageBox.Show()行をforeachループの外に移動する必要があることに気付きましたが、最後のファイルのみが表示され、すべてではありません。

1つのメッセージボックスにすべてのファイルを表示するコードは何でしょうか?

// for each file in selected folder, print out its name and MD5 checksum value
   foreach (string file in Directory.GetFiles(folderBrowserDialog1.SelectedPath))
   {
       using (var md5 = MD5.Create())
       {
           using (var stream = File.OpenRead(file))
           {
               checksum = BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "").ToLower();
               MessageBox.Show(file + ": " + checksum);
           }
       }
   }
4

3 に答える 3

3

StringBuilderを使用し、各反復中にファイル/チェックサムをstringbuilderオブジェクトに追加してから、次のようMessageBox.Show()にstringbuilderオブジェクトを呼び出します。

StringBuilder s = new StringBuilder();
foreach (string file in Directory.GetFiles(folderBrowserDialog1.SelectedPath))
{
    using (var md5 = MD5.Create())
    {
        using (var stream = File.OpenRead(file))
        {
            checksum = BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "").ToLower();
            s.AppendLine(file + ": " + checksum);
        }
    }
}
MessageBox.Show(s.ToString());

または使用:

s.AppendFormat("{0}: {1}", file, checksum).AppendLine();

ループの反復ごとに新しい文字列を作成するオーバーヘッドを回避するためのループ内*クレジットはDestrictorに送られます*

于 2013-02-05T15:19:36.317 に答える
1

これを行う最も簡単な方法は、リスト変数を作成し、表示する各文字列を追加することです。foreachループの後に、行を追加します。 MessageBox.Show(string.Join(Environment.NewLine,MyList.ToArray())); これでうまくいくはずです。

于 2013-02-05T15:20:07.637 に答える
0

string foo = "";ループの前に文字列変数を宣言し、このコード行をループの内側に追加するのはどうですか。

foo += file + ": " + checksum + System.Environment.NewLine;

そして、ループの後:

MessageBox.Show(foo);
于 2013-02-05T15:23:04.490 に答える