gpt4 book ai didi

c# - 确定文件夹大小的并行循环

转载 作者:行者123 更新时间:2023-11-30 17:37:14 25 4
gpt4 key购买 nike

总体程序目标是确定目录中主要文件夹的大小。它适用于小型驱动器,但适用于较大的驱动器。我绝对需要的驱动器之一花了 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 个子文件夹。

最佳答案

并行访问同一物理驱动器不会加快工作速度。

您的主要问题是 GetFiles 方法。它遍历所有子文件夹,收集所有文件名。然后你再次传递相同文件的循环。

改为使用 EnumerateFiles 方法。

试试这段代码。它会快得多。

public long GetDirectorySize(string path)
{
var dirInfo = new DirectoryInfo(path);
long totalSize = 0;

foreach (var fileInfo in dirInfo.EnumerateFiles("*.*", SearchOption.AllDirectories))
{
totalSize += fileInfo.Length;
}
return totalSize;
}

MSDN :

The EnumerateFiles and GetFiles methods differ as follows: When you use EnumerateFiles, you can start enumerating the collection of names before the whole collection is returned; when you use GetFiles, you must wait for the whole array of names to be returned before you can access the array. Therefore, when you are working with many files and directories, EnumerateFiles can be more efficient.

关于c# - 确定文件夹大小的并行循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38335832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com