プログラム全体の目標は、ディレクトリ内のメインフォルダのサイズを決定することです。小さなドライブではうまく動作しますが、大きなドライブでは苦労します。私が絶対に必要とするドライブの1つに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ループでこの関数を呼び出しますメインフォルダ名の直下に少なくとも7つのサブフォルダがあることを知っているので、すべて同じレベルにあり、getDirectorySize()を使用してそれらをすべて同時に実行するサブフォルダ(サブフォルダ名)です。
あなたは再帰検索を使用しての代わりに、全体を一度ドライブ上のすべてのファイルを取得する考えたことがあり'Directory.GetFiles'で?おそらく何百万ものエントリを含む巨大な結果配列を読み込むよりも、メモリに効率的かもしれないと思います。 –
Directory.GetFilesは、フォルダであるpだけのファイルを取得しています。 foreach文を使ってドライブ内のメインフォルダ名を取得した後、この関数を呼び出します。私は再帰関数を考えましたが、通常はvoid関数であり、私はまだb(実際にはメインフォルダの合計サイズ)を返します。あなたは何を意味するかをもっと説明できますか? – Tasha
また、 'Parallel'はプログラムのCPU境界部分にのみ有効です。並列化できるCPUアクティビティがいくつかある可能性がありますが、並列化の利点を生かしたI/Oに大部分の時間が費やされていると思われます。 –