问题描述
我遇到了一些代码问题,我想用它来散列多个文件。我在visual studio中使用wpf,代码如下:
public string checkMD5(string filename)
{
string output;
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(filename))
{
byte[] hash = md5.ComputeHash(stream);
StringBuilder sb = new StringBuilder(hash.Length);
foreach (byte b in hash)
{
sb.AppendFormat("{0:X2}",b);
}
output = filename + " MD5 Hash = " + sb.ToString();
}
}
return output;
}
问题是,它以以下形式提供了多个文件名的列表 C://file1 C://file2 C://file3
代码执行 1 个文件名就好了。如何通过此文件名列表进行上述循环?非常感谢任何帮助..我已经在这两天了:(
解决方法
您可以使用 String.Split() 来拆分它们,然后循环遍历每个:
string[] individualFileNames = filename.Split(' ');
foreach(string individualFileName in individualFileNames)
{
// open and process file individualFileName here
}
,
您需要一个包含文件名的字符串数组,然后有一个简单的 for
或 foreach
循环:
for (int i = 0; i < fileNameArray.Length; i++)
{
string output = checkMD5(fileNameArray[i]);
}
or
foreach (string fileName in fileNameArray)
{
string output = checkMD5(fileName);
}
要从目录中获取文件名数组,您可以使用函数 Directory.GetFiles。
考虑到您说函数是 being fed a list of multiple filenames in the form of C://file1 C://file2 C://file3
我将假设文件名在单个字符串中,如果是这种情况,您将不得不想办法将其拆分为文件数组名称,然后将每个名称传递给上述函数,为此您可以尝试使用 String.Split 像这样:
string fileNames = "C://file1 C://file2 C://file3";
string[] fileNameArray = fileNames.Split(' ');
//fileNameArray[0] > C://file1
//fileNameArray[1] > C://file2
//fileNameArray[2] > C://file3
foreach (...)
请记住,如果任何文件名的路径中有空格,那么这将不起作用,例如:
string fileNames = "C://Some Files//file1 C://file2 C://file3";
string[] fileNameArray = fileNames.Split(' ');
//fileNameArray[0] > C://Some
//fileNameArray[1] > Files//file1
//fileNameArray[2] > C://file2
//fileNameArray[3] > C://file3
在此示例中,C://Some Files//file1
将被拆分为 2,因为路径在目录名称 Some Files
中有一个空格。
我建议只使用 Directory.GetFiles 来获取文件名列表,而不是其他任何东西。