1

正如您从下面的注释代码中看到的那样,我正在尝试在消息框内的文件夹中显示每个文件的名称和校验和。问题是这会为每个文件弹出一个单独的消息框,而不是在一个窗口中显示它们。我意识到我需要将 MessageBox.Show() 行移到 foreach 循环之外,但是它只显示最后一个文件而不是所有文件。

在一个消息框中显示所有文件的代码是什么?

// 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

最简单的方法是创建一个 List 变量并添加要显示的每个字符串。在 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 回答