質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

5137閲覧

【C#】フォルダとファイルの削除を実行しているときに進捗状況をプログレスバーなどで表示させたい。

Satochan24

総合スコア113

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2015/10/06 08:58

下記のようなコードで、メインのフォームの削除ボタン、data_del_btnを押したときに
ファイル、フォルダの削除を実行させています。

//ローカルの保存先を取得 var localPath = Contents.Path.GetDataDir(); System.IO.DirectoryInfo target = new System.IO.DirectoryInfo(localPath); // ファイルを消す foreach (FileInfo file in target.GetFiles()) { file.Delete(); } //フォルダも消す foreach (DirectoryInfo dir in target.GetDirectories()) { dir.Delete(true); }

特定のフォルダ(dataフォルダ)内の中身のフォルダとファイルのみを削除させているのですが、
2000フォルダ位(容量にして8GBくらい)ある場合に、結構時間がかかってしまい、
その間、何も表示させないのは不自然に思い、別フォームやダイアログなどで、プログレスバーなどの
進捗状況を表示させたいと思っています。
Webで、プログレスバーの表示を検索しましたが、似たような状況ではなかったり、
かなり複雑な処理をしているページしかありませんでした。
進捗状況を表示させるのは、そんなに複雑な処理が必要なのでしょうか?
何か、比較的簡単に実現できる方法や、参考になるページがあれば教えてください。

フォルダ構造は、

dataフォルダ - 1 フォルダ - ○○ファイル…
2フォルダ -△ファイル…
4フォルダ -□ファイル…

となっています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

通常そういった場合は重い処理をバックグラウンドで行います。
実装上はWinFormsであればBackgroundWorkerが最も簡単ではないでしょうか。

http://dobon.net/vb/dotnet/programing/progressdialogbw.html

C#

1private void button1_Click(object sender, EventArgs e) 2{ 3 //バックグラウンドで開始 4 backgroundWorker1.RunWorkerAsync(); 5 6 //TODO:プログレスバーの初期化・開始など 7} 8 9private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 10{ 11 //TODO:削除処理 12} 13 14private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 15{ 16 //TODO:完了メッセージとか 17 MessageBox.Show("完了"); 18} 19 20private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 21{ 22 //TODO:必要に応じてプログレスバーを進める 23}

投稿2015/10/06 09:11

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Satochan24

2015/10/06 09:25

さっそくのご回答、有難うございます! BackgroundWorker、初めて聞きました。なかなか本とかにも載ってないですね~。 明日、実際に試してみて、再度コメントします。
Satochan24

2015/10/07 05:17

こんにちは。プログレスバーの件、 試していますが、まだうまく動かない状況です。 メイン画面からボタンのクリックで別フォーム内のプログレスバーを動かしたいのですが、別フォームは、DataDelForm.cs その中のプログレスバーは、 progressBar_Delと名前を付け、DataDelForm.csクラスのコンストラクタ内で、 プログレスバーのとりあえずの初期化、     progressBar_Del.Minimum = 0; progressBar_Del.Maximum = 100; progressBar_Del.Value = 0; を行っています。 メインフォームのイベントハンドラ、data_del_btn_Clickの プログレスバーの初期化の部分には、クラスの冒頭でインスタンス化 DataDelForm ddf = new DataDelForm(); して参照変数ddfに入れた //TODO:プログレスバーの初期化・開始など ddf.ShowDialog(); を実行しました。 backgroundWorker1_ProgressChangedの部分には、 //TODO:必要に応じてプログレスバーを進める ddf.pgbar.Value = e.ProgressPercentage; を記述しました。 現状、プログレスバーの別フォームは立ち上がりますが、そこで止まっています。 あと、できれば、dataフォルダ内の最上位フォルダ(1、2、…)の個数を別フォームにプログレスバーと共に表示できたらと思っています。 修正可能でしょうか?
Tak1wa

2015/10/07 05:34

デバッグ実行時にbackgroundWorker1_ProgressChangedは通っていますか?ここを通すためには進捗状況の通知を行う必要があります。 backgroundWorker1_DoWorkからbackgroundWorker1.ReportProgressメソッドで進捗率を通知してください。 また、この機能を使うためにはbackgroundWorker1.WorkerReportsProgressをtrueにする必要があります。 dataフォルダ内の個数については別フォーム表示前に行うのですか?であればメインスレッドで個数の計算をして別フォームに渡してください。 バックグラウンドスレッドで行いたいのであれば計算は問題ないと思いますが、別フォームに表示を行う際にUIスレッドで行う必要があります。(Invokeしなきゃいけない) 上記にいくつか検索キーワードとなるものを意図的に含めましたので調べてみてください。
Satochan24

2015/10/07 07:03

回答有難うございます。デバッグ時に通ってなかったです。 さらには、削除ボタンクリックのイベントハンドラにブレーク設定しても、 ヒットしないとvisual Studioに警告されました。 なぜボタンクリックのイベントハンドラも通らなくなったのか、調査中です。 BackgroundWorkerの処理にしただけなのですが…
Tak1wa

2015/10/07 07:07

Visual Studioに警告されたんですか? それはちょっと正常とは異なります。まずはソリューションのクリーン→リビルドを行ってみてください。
Satochan24

2015/10/07 07:52

回答有難うございます。ソリューションのクリーン、リビルドを行いましたが、状況は変わりませんでした。 元のbackgroundworker使用前に戻してみたらVisual Studioの警告も消え、実行したらブレークがかかりました。
Tak1wa

2015/10/07 08:04

http://popo.ara3.net/etc/vs.htm 上記などを参考にブレークがかかるようにしてみてはどうでしょう。 進捗表示フォームが表示されるということはボタンクリックイベントハンドラ自体は動いているということですね。
Satochan24

2015/10/07 08:19

回答有難うございます。了解しました。 もう少し、調べてみます。 進捗があれば、またご報告します。
Satochan24

2015/10/09 09:31

こんばんは。 無事、プログレスバー作成できました。(ベストのものではないですが…) 動かなかったのは、恐らく、実際の削除処理で、プログレスバーの表示の更新方法を記載していなかったのもあったかと思います。 一応、サンプルコードがWebにあったので、下記を元に作成しました。そのため、backgroundworkerは使わなかったです。 どうも、いろいろお手数おかけしました。 何か、処理をさせたいときに、サンプルのコードがないと全然作れなくて…すみませんでした。 あまり、本質的な理解ができてない証拠でしょうね。(^^; http://www.geocities.jp/kandou_quester/Knowledge/Programming/CSharp/_progressbar_display.html
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問