【发布时间】:2016-07-12 17:51:02
【问题描述】:
整个程序的目标是确定目录中主文件夹的大小。它适用于小型驱动器,但适用于较大的驱动器。我绝对需要的驱动器之一花了 3 个多小时。这是我正在使用的文件夹大小调整程序的副本。
public double getDirectorySize(string p)
{
//get array of all file names
string[] a = Directory.GetFiles(p, "*.*", SearchOption.AllDirectories);
//calculate total bytes in loop
double b = 0;
foreach (string name in a)
{
if (name.Length < 250) // prevents path too long errors
{
//use file info to get length of each file
FileInfo info = new FileInfo(name);
b += info.Length;
}
}
//return total size
return b;
}
所以我想以并行 foreach 循环的形式使用并行循环。每个 p 代表主文件夹的名称。我正在考虑以某种方式将路径 p 拆分为其子文件夹并使用并行 foreach 循环继续收集文件大小;但是,它们具有未知数量的子目录。这是我在尝试恢复文件夹大小时遇到问题的地方。提前感谢您的帮助
更新
我通过下面这个foreach循环调用这个函数
DirectoryInfo di = new DirectoryInfo (Browse_Folders_Text_Box.Text);
FileInfo[] parsedfilename = di.GetFiles("*.*", System.IO.SearchOption.TopDirectoryOnly);
parsedfoldername = System.IO.Directory.GetDirectories(Browse_Folders_Text_Box.Text, "*.*", System.IO.SearchOption.TopDirectoryOnly);
//parsedfilename = System.IO.Directory.GetDirectories(textBox1.Text, "*.*", System.IO.SearchOption.AllDirectories);
// Process the list of folders found in the directory.
type_label.Text = "Folder Names \n";
List<string> NameList = new List<string>();
foreach (string transfer2 in parsedfoldername)
{
this.Cursor = Cursors.WaitCursor;
//Uses the path and takes the name from last folder used
string dirName = new DirectoryInfo(@transfer2).Name;
string dirDate = new DirectoryInfo(@transfer2).LastWriteTime.ToString();
NameList.Add(dirName);
//Form2 TextTable = new Form2(NameList.ToString());
//Display_Rich_Text_Box.AppendText(dirName);
//Display_Rich_Text_Box.AppendText("\n");
Last_Date_Modified_Text_Box.AppendText(dirDate);
Last_Date_Modified_Text_Box.AppendText("\n");
try
{
double b;
b = getDirectorySize(transfer2);
MetricByte(b);
}
catch (Exception)
{
Size_Text_Box.AppendText("N/A \n");
}
}
Display_Rich_Text_Box.Text = string.Join(Environment.NewLine, NameList);
this.Cursor = Cursors.Default;
所以当我想到并行 foreach 循环时,我在想的是获取下一个实例名称(子文件夹名称),它们都在同一级别,并使用 getDirectorySize() 同时运行它们,因为我知道那里在主文件夹名称的正下方至少有 7 个子文件夹。
【问题讨论】:
-
您是否想过使用递归搜索而不是使用
Directory.GetFiles一次性获取整个驱动器上的所有文件?我认为它在内存方面可能比加载可能包含数百万个条目的巨大结果数组更有效。 -
Directory.GetFiles 正在获取仅 p 的文件,这是一个文件夹。我在使用 foreach 语句获取驱动器中的主文件夹名称后调用此函数。我考虑了一个递归函数,但通常它们是 void 函数,我仍然希望返回 b (主文件夹的实际总大小)。你能解释一下你的意思吗?
-
另请注意,
Parallel仅对程序的 CPU 绑定部分有益。可能有一些 CPU 活动可以并行化,但我怀疑您的大部分时间都花在 I/O 上,这不会从并行化中受益。 -
@DStanley -- 和内存分配/页面交换。
-
@Tasha -- 你不需要
void进行递归。或者你可以,并且只使用你不断添加的输出参数。由你决定。
标签: c#