前提・実現したいこと
フォルダ内のサイズを計算するコードを組んでいるのですが、フォルダ内を回している際、
パス名の長いファイル、フォルダのパス名それぞれのベスト3も格納したいと思っています。
もしかしたら、いろいろなやり方があるかもしれませんが、短いコードで書きたいです。
ご教示のほどお願い致します。
試したこと
ベスト1だけを格納したい場合は、単純なif文で実装できました。
しかし、これがファイル、フォルダのそれぞれベスト3を格納するとなると、
どのように実装していいかわかりません。
C#
1 static string longfile = ""; 2 static string longdir = ""; 3 4 public static long GetDirectorySize(DirectoryInfo dirInfo) 5 { 6 long size = 0; 7 8 //フォルダ内の全ファイルの合計サイズを計算する。 9 foreach (FileInfo fi in dirInfo.GetFiles()) 10 { 11 size += fi.Length; 12 13 if (fi.FullName.Length > longfile.Length) 14 { 15 longfile = fi.FullName; 16 } 17 } 18 19 //サブフォルダのサイズを合計していく。 20 foreach (DirectoryInfo di in dirInfo.GetDirectories()) 21 { 22 size += GetDirectorySize(di); 23 24 if (di.FullName.Length > longdir.Length) 25 { 26 longdir = di.FullName; 27 } 28 } 29 30 //結果を返す 31 return size; 32 }
追記
フォルダを指定してエラーが出た件ですが、なんとなく原因がわかりました。
そのフォルダのパス名を短くしたら、表示される容量が変わったので、
そのフォルダ内に長すぎるファイルやパスがあるのが原因だと思います。
このような長いパスを知る為に、longfile.ElementAt(0)~longfile.ElementAt(3)で出力したかったのですが、
これはエラーが出てしまうから無理なのでしょうか?
不思議なのは、longfile.ElementAt(0)~longfile.ElementAt(3)をコメントアウトして、
long dirsize = GetDirectorySize(new DirectoryInfo(@"C:\〇〇\〇〇"));
のコードだけならば、例のフォルダを指定してもエラーにならない所です。
追記②
papinianus様のご指示に従って、設計を変えてみましたが、
filelist.OrderByDescending(s => s.FullName.Length).Take(3);
のコードで赤線が付いてエラーになります。
ご教示のほどお願い致します。
C#
1 private void Form1_Load(object sender, EventArgs e) 2 { 3 Console.WriteLine("test"); 4 //long dirsize = GetDirectorySize(di); 5 List<FileInfo> filelist = MyDirectoryInfo(@"C:\Users\〇〇\Desktop\My Documents"); 6 7 //下記でエラーになります。長いパス名ベスト3を取得したいです。 8 IOrderedEnumerable<string> longlist = filelist.OrderByDescending(s => s.FullName.Length).Take(3); 9 } 10 11 public static List<FileInfo> MyDirectoryInfo(string dirpath) 12 { 13 DirectoryInfo di = new DirectoryInfo(dirpath); 14 List<FileInfo> filelist = new List<FileInfo>(); 15 GetDirectoryInfo(di, ref filelist); 16 return filelist; 17 } 18 19 public static void GetDirectoryInfo(DirectoryInfo dirInfo, ref List<FileInfo> list) 20 { 21 //long size = 0; 22 23 //フォルダ内の全ファイルの合計サイズを計算する。 24 foreach (FileInfo fi in dirInfo.GetFiles()) 25 { 26 list.Add(fi); 27 //size += fi.Length; 28 //longfile = ((longfile.Concat(new[] { fi.FullName })).OrderByDescending(s => s.Length)).Take(3); 29 } 30 31 //サブフォルダのサイズを合計していく。 32 foreach (DirectoryInfo di in dirInfo.GetDirectories()) 33 { 34 GetDirectoryInfo(di, ref list); 35 //size += GetDirectorySize(di); 36 } 37 38 //結果を返す 39 //return size; 40 }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/20 12:56
2018/07/20 12:58