- ベストアンサー
[C#]このコードはもっと速くなると思いますか?
フォルダ内の全ファイルを取得する、以下のようなコードを組んでみました。 このコードでは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前後の結果になります。 このリストを取得するのに、さらにスピードアップさせる方法はあると思いますか? どんな些細な事でも良いので答えて下さるとありがたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (2)
- bluecampus
- ベストアンサー率66% (138/209)
- hitomura
- ベストアンサー率48% (325/664)
関連するQ&A
- 決まった拡張子のファイルだけ表示したい(C#)
こんばんわ。また質問させてください。 ボタン1を押すことでリストに指定したフォルダの中身をすべて表示するプログラムが出来たのですが、このあとテキストファイルだけを表示したい場合はどうしたらいいのでしょうか? テキストファイルだけをリストに昇順で表示して、それらテキストファイルの内容をすべて連結してみたいのでご指導してくださると助かります。 連結の方法は分かりました。 private void button1_Click(object sender, System.EventArgs e) { string systemFolder = "ここにフォルダのパス"; DirectoryInfo di = new DirectoryInfo(systemFolder); // フォルダ内のファイルをリストに表示 foreach(FileInfo fi in di.GetFiles()) { listBox1.Items.Add(fi.Name); } }
- ベストアンサー
- C・C++・C#
- C#)フォルダを参照したい
こんにちわ。 フォルダを参照してその中身をリストBOXに表示したいのですが、サンプルを見つけて実行したのですがいまいち理解できなかったのでアドバイスくださると助かります。 private void button1_Click(object sender, System.EventArgs e) { string systemFolder = Environment.GetFolderPath (Environment.SpecialFolder.System); DirectoryInfo di = new DirectoryInfo(systemFolder); foreach(FileInfo fi in di.GetFiles()) { listBox1.Items.Add(fi.Name); } } これでボタン1をクリックするとsystemフォルダの内容がリストに表示されるのですが、そもそもどこのsystemフォルダなのか分かりません・・・。 ↑のプログラムが分からず別の方法でまずフォルダ参照ダイアログの FolderBrowserDialog を使おうと思ったのですが、ツールBOXに無いのでまた困りました。 どなたか分かる方いたらご指摘お願いします。
- ベストアンサー
- C・C++・C#
- C# StreamReader,StreamWriter による文字化
C# StreamReader,StreamWriter による文字化け お世話になります。 文字化けで悩んでいます。 Visual Studio 2008 C# にて、テキストファイルからデータを読んで別のテキストファイルに そのまま書き出す(もちろん実際の運用では加工するわけですが)処理で文字化けが起こります。 そのテキストファイル自身を C# で作れば問題はないのですが、メモ帳を使って書き込んだファイルでは 文字化けが起こります。 対処方法があれば教えてください。 以下はその実験に使ったコードです。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace ConsoleApplication5 { class Program { static void Main(string[] args) { // これは正常に書き込みできました StreamWriter sw = new StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\test.txt"); sw.WriteLine("これはてすとです。"); sw.WriteLine("This is test."); sw.Close(); // これも正常に読み込め、書き込みもできました StreamReader sr = new StreamReader(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\test.txt"); sw = new StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\newtest.txt"); while (!sr.EndOfStream) { sw.WriteLine(sr.ReadLine()); } sr.Close(); sw.Close(); // 次はあらかじめメモ帳で作ったファイルを読んで、別のファイルに書き出します // これが文字化けします sr = new StreamReader(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\test2.txt"); sw = new StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\newtest2.txt"); while (!sr.EndOfStream) { string dat = sr.ReadLine(); sw.WriteLine(dat); Console.WriteLine(dat); } sr.Close(); sw.Close(); } } }
- ベストアンサー
- C・C++・C#
- Visual Studio 2017C#
下記のVisual Studio 2017 C# 19行目のXの定義がありません。 と出ました。 11行目で定義していると思うのですけど…。 どういうことなのか教えてください。 ご多忙のところ恐れ入りますが、ご回答のほどよろしくお願いします。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace jump25 { class Test { public int x = 10; } class Program { public static void Main(string[] args) { Test obj = new Test(); int y = object.x; Console.WriteLine(y); } } }
- ベストアンサー
- C・C++・C#
- C# override
某C#の入門書のサンプルですが、overrideがよくわかりません。 using System; using System.Collections.Generic; using System.Text; namespace PersonList { class Person { public string name; public int age; public Person(string nam, int ag) { name = nam; age = ag; } public override string ToString() { return String.Format("{0}({1})", name, age); } } class Program { static void Main(string[] args) { List<Person> p = new List<Person>(); p.Add(new Person("Pochi", 3)); p.Add(new Person("Kenta", 5)); p.Add(new Person("Mari", 4)); p.Add(new Person("Wanko", 1)); p.Add(new Person("Doggy", 4)); p.ForEach(Console.WriteLine); } } } 1.overrideをしないと 「PersonList.Person」が出力されてしまうのですが なぜToString()をoverrideするのかがわかりません。 2.override しないですべての内容を出力するためにはどうしたら いいのでしょうか?
- 締切済み
- C・C++・C#
- C# Listクラスにクラスを追加したいがエラー
以下のようなコードを書いたのですが (A)(B)の箇所で (A) error CS1513: } が必要です。 (B) /error CS1022:型、名前空間の定義、またはファイルの終わりが必要です。 というエラーになるのですが、なにが間違っているのでしょうか。 --------------------------------------------------- using System; using System.Collections.Generic; namespace My { class MyClass { public static void Main() { // <--- (A) public List<Book> myList = new List<Book> { new Book(){ title = "ABC", price = 1000 }, new Book(){ title = "DEF", price = 2000 } }; } } class Book { //プロパティの自動実装 public string title { get; set; } public decimal price { get; set; } } } // <--- (B) ---------------------------------------------------
- ベストアンサー
- C・C++・C#
- C# マルチスレッドにおける例外処理
下記のようなデリゲートを利用したマルチスレッドのプログラムを組みました。 しかし、マルチスレッド内で例外がおきても、正常にプログラムが終了してしまいます。 (try-catchでも例外を捕捉できません) マルチスレッドプログラムにおいて、例外を捕捉するにはどうすれば、いいのでしょうか? using System; using System.Threading; class Class1 { delegate void delg(); public static void Main() { delg d = new delg(multi); d.BeginInvoke(new AsyncCallback(call), null); //マルチスレッド開始 System.Threading.Thread.Sleep(500); //マルチスレッドで例外を強制的に投げているので、 //ここまでたどり着く前にアプリケーションが落ちるはず。 //しかし、実際には正常終了。 Console.WriteLine("メインメソッド 正常終了"); } public static void multi() { Console.WriteLine("マルチスレッドで実行中"); throw new Exception(); //例外を強制的に投げる。 } public static void call(IAsyncResult ar) { Console.WriteLine("コールバックメソッド実行"); } }
- ベストアンサー
- C・C++・C#
- C#についての質問です
Microsoft Visual C# 2010 Express をつかって using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Console { class Program { static void Main(string[] args) { Console.WriteLine("皆様、はじめまして"); } } } と入力して.csで保存したのですが、コマンドプロンプトで 'csc' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 とでてコンパイルできません。対応を教えてください。
- ベストアンサー
- Windows Vista
- c#のプログラムについて。
c#のプログラムについて。 お世話になります。 c#初心者です。 下記の様なコードを記述してますが、 「 Form1.Button1.Visible == false;」の部分で 「'WindowsFormApplication1.Form1'にButton1'の定義がありません。」 と言うエラーが出てしまいます。 どの様に定義して良いのかが分からず、悩んでいます。 どなたかお教え頂きたく宜しくお願い致します。 記 using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace WindowsFormsApplication3 { static class Program { /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); string result = System.Environment.MachineName; if (result == "xxxxxxx") { Form1.Button1.Visible == false; } } } }
- ベストアンサー
- C・C++・C#
- OutLookのメール受信通知 (C#)
教えてください。C#の勉強中でわからないところがあります。 [環境] C# 2.0 windowsXP Outlook2003 [内容] アプリケーションを起動後、 Outlookでメールを受信したら、アプリケーションでFormの表示のラベルを変更したいのでが、うまくいきません。教えてくださいませ。 ちなみに、下記のソースはMessageBoxで作成したものです。 MessageBoxだとうまくいくのですが・・・ using System; using System.Windows.Forms; using OutLook = Microsoft.Office.Interop.Outlook; [ソース] using System; using System.Windows.Forms; using OutLook = Microsoft.Office.Interop.Outlook; [STAThread] static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new frmMessage()); MessageBox.Show("待機中"); MessageStand(); } /// <summary> /// OutLook待機処理 /// </summary> private static void OneSightMessageStand() { OutLook.ApplicationClass outLookApp = new OutLook.ApplicationClass(); outLookApp.NewMailEx += new OutLook.ApplicationEvents_11_NewMailExEventHandler(outLookApp_NewMailEx); } /// <summary> /// イベント処理 /// </summary> private static void outLookApp_NewMailEx(string EntryIDCollection) { MessageBox.Show("受信しました。" + EntryIDCollection, "NOTE", MessageBoxButtons.OK); # 通常ならメッセージボックスではなくイベントが発生したら、Formのラベルにメッセージを表示したい。 frmMessage objfm = new frmMessage(); objfm.label.txt = "受信しました。"; }
- 締切済み
- その他(プログラミング・開発)
お礼
多数のご提案、ありがとうございます。 残念ながら上二つは、速度アップに繋がりませんでした。 (http://ufcpp.net/study/csharp/sp_foreach.html 余談ですが上記リンク先の後ろ2行によると、配列のforeachはfor相当のコードに最適化されるようですね) FindNextFile()についてはP/Invokeという聞き慣れない単語、さらにunsafeを使うという事ですので、すみませんがお礼だけ先にするという形を取らせて貰います。 私程度の頭で理解出来るか分かりませんが、少しずつでも調べて組んでみたいと思います。 >これ以上は打つ手なし、でしょうか。 うーん、なるほどそうです。 いや十分すぎるほど参考・勉強になりました。