![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
フォルダ内の全ファイルを取得する、以下のようなコードを組んでみました。
このコードではFileInfoを配列に入れていますが、厳密には「ファイル名」「ファイルパス」「ファイルサイズ」「更新日時」を格納したリストが欲しいです。
using System;
using System.Collections.Generic;
using System.Diagnostics;
static void Main(string[] args) {
Stopwatch sw = new Stopwatch();
sw.Start();
//windows xpを使っています
DirectoryInfo di = new DirectoryInfo(@"C:\WINDOWS");
test(di);
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
}
//ファイル情報を格納する配列
static List<FileInfo> list = new List<FileInfo>();
//全ファイルの探索
static void test(DirectoryInfo di) {
foreach(FileInfo fi in di.GetFiles())
list.Add(fi);
foreach(DirectoryInfo ddi in di.GetDirectories())
test(ddi);
}
ちなみに私の環境では1000ms前後の結果になります。
このリストを取得するのに、さらにスピードアップさせる方法はあると思いますか?
どんな些細な事でも良いので答えて下さるとありがたいです。
No.2ベストアンサー
- 回答日時:
こんばんは。
手っ取り早くは、「foreach」を「while」又は「for」に差し替える、と言った所でしょうか。
当方が書店でC#の書籍を立ち読みした際に、「foreach」は「for」と比較して実行コストがかかる、と記載されていたと記憶しています。
日本のサイトから探し出せなかったので、海外サイトになりますが、
・「Which loop is better in performance - foreach or for or while?」
http://forums.asp.net/t/1041090.aspx
100000回ループで、
for->0.0003745秒
while->0.0003641秒
foreach->0.0009076秒
と言う計測結果が出ています。
・「C# Foreach Loop Optimization」
http://dotnetperls.com/foreach-loop-optimization
こちらの方は、メンバ変数ではなく、ローカル変数へコピーしたものを「foreach」で使用すると僅かながらも速度が改善すると言うネタの様です。
その他のネタとしては、「FindNextFile()API」等を直接呼び出してみる、と言ったところです。
但し、P/Invokeを始め、C言語同等のプレーンな構造体を用意する必要があり、unsafeキーワードの使用も避けられそうにありません。コードもややこしくなります。
勿論、内部的にはNetFrameworkがAPIを呼び出している筈ですが、API呼び出しに到達するまでにはそれなりに時間がかかっているでしょうから、時間に余裕があれば実験してみる価値はあるかもしれません。
ツリービューにディレクトリ構造とファイルを表示する場合は、クリックされたフォルダから+2階層先まで検索して、こっそりとツリーアイテムを追加して行く事で容易に最適化が行えるのですが、ファイル名等をリストコレクションに収めて行きたいと言う事の様ですので、これ以上は打つ手なし、でしょうか。
多数のご提案、ありがとうございます。
残念ながら上二つは、速度アップに繋がりませんでした。
(http://ufcpp.net/study/csharp/sp_foreach.html
余談ですが上記リンク先の後ろ2行によると、配列のforeachはfor相当のコードに最適化されるようですね)
FindNextFile()についてはP/Invokeという聞き慣れない単語、さらにunsafeを使うという事ですので、すみませんがお礼だけ先にするという形を取らせて貰います。
私程度の頭で理解出来るか分かりませんが、少しずつでも調べて組んでみたいと思います。
>これ以上は打つ手なし、でしょうか。
うーん、なるほどそうです。
いや十分すぎるほど参考・勉強になりました。
No.3
- 回答日時:
ちなみにコマンドプロンプトで
dir /s C:\Windows > 適当なファイルのパス
だとどれぐらいかかりますか?
その時間とあまり変わらないのであればそんなに早くできないのかなぁと。
なるほど、その手がありましたか。
というわけで、早速試してみましたけど体感的にはあまり変わらない感じですね。
うーん、これ以上の速度アップは難しそうですね。
これを結論として締めさせて頂きます、ありがとうございました。
No.1
- 回答日時:
> foreach(FileInfo fi in di.GetFiles())
> list.Add(fi);
の部分を
list.AddRange(di.GetFiles());
に変えてみたらどうでしょうか。
参考URL:http://msdn.microsoft.com/ja-jp/library/z883w3dc …
回答ありがとうございます。
こんな質問に答えてくれるような奇特な人はいないだろう、と思ってたので正直嬉しいです。
しかし残念ながら速度アップには至りませんでした。
AddRangeの存在をすっかり忘れてたので、この回答を見た時の衝撃はかなりものだったんですけど。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- Java java final 1 2022/06/10 22:49
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# PC画面を録画するプログラムでdllの読み込みエラー 1 2023/04/22 08:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フルパスから最後のディレクト...
-
どんなプログラムを書いても指...
-
fopenで別ディレクトリにファイ...
-
GetPrivateProfileStringでini...
-
windows.hがincludeされない
-
ファイルやディレクトリの存在...
-
FTPでputすると空ファイルが出...
-
マイクラでPythonのプログラミ...
-
インクルードファイルの設定に...
-
「UNCパスはサポートされません...
-
C言語を用いたファイルの一括削...
-
ExcelVBAでカレントディレクト...
-
VBでのAPI
-
ExcelVBA サーバーの(共有フォ...
-
ドラッグ&ドロップについてです...
-
C言語でファイルを読み込みたい
-
絶対パスの絶対て英語で何でし...
-
ネットワーク上のコンピュータ...
-
セルに入力されたパスでフォル...
-
Excelマクロからのバイナリデー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フルパスから最後のディレクト...
-
どんなプログラムを書いても指...
-
FTPでputすると空ファイルが出...
-
windows.hがincludeされない
-
ExcelVBAでカレントディレクト...
-
マイクラでPythonのプログラミ...
-
webアプリケーションでの画像フ...
-
GetPrivateProfileStringでini...
-
fopenで別ディレクトリにファイ...
-
ファイルやディレクトリの存在...
-
「UNCパスはサポートされません...
-
C言語を用いたファイルの一括削...
-
ネットワーク上のコンピュータ...
-
絶対パスの絶対て英語で何でし...
-
エクセルVBAで相対パスでファイ...
-
ファイルダイアログのカレント...
-
ExcelVBA サーバーの(共有フォ...
-
フォルダ名をだすには
-
ThisWorkbook.Pathについて
-
AfxLoadLibrary関数で、DLLのハ...
おすすめ情報