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

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

ただいまの
回答率

90.34%

  • C#

    7695questions

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

フォルダ内を回しているときに進捗率を表示させたい

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 252

tkmnusr

score 177

 前提・実現したいこと

フォルダ内の容量を調べるプログラムを作っているのですが、foreach文で回しているときに
その進捗をプログレスバーで表示させようとして、countという変数を設けて
コードを組んでみたのですがエラーになってしまいます。
どのようなコードを組めばよいでしょうか?
ご教示お願いします。

 該当のソースコード

        public static long GetDirectorySize(DirectoryInfo dirInfo, ProgressBar pb)
        {
            int dircount = dirInfo.GetDirectories().Length;
            int filecount = dirInfo.GetFiles().Length;
            int allcount = dircount + filecount;
            pb.Minimum = 0;
            pb.Maximum = allcount;

            int count = 0;
            long size = 0;

            //フォルダ内の全ファイルの合計サイズを計算する。
            foreach (FileInfo fi in dirInfo.GetFiles())
            {
                size += fi.Length;
                count++;
                pb.Value = count;
            }

            //サブフォルダのサイズを合計していく。
            foreach (DirectoryInfo di in dirInfo.GetDirectories()){
                size += GetDirectorySize(di, pb);
                count++;
                pb.Value = count;  //ここでエラー。
            }
            //結果を返す
            return size;
        }

 エラーメッセージ

System.ArgumentOutOfRangeException: ''5' の値は 'Value' に対して有効ではありません。'Value''minimum''maximum' の間でなければなりません。
パラメーター名:Value'
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

ProgressBarのValueプロパティの範囲外エラーですね。
maximumとminimumとの間の値かをチェックしてください

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

ディレクトリに対して再帰的に呼び出しをかけているのにpbが一つだからです。

仮に最初の改装にディレクトリが一つファイルが4つで、子ディレクトリにファイルが一つしかないと過程します。
この関数の最初にmaximumが5になりますが、子に下降すると1に再セットされます。そして親に戻ってきたときにカウントアップされると5になりますがoutofrangeですよね。

でも、これを頑張っても、下の階層が読めない以上、昔のwindowsのコピーとかで出てた信用ならないプログレスバーができあがる気がします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/19 19:59

    頑張る頑張りかたとしては、pb.maximumに代入(=)するのではなく、加算(+=)することが考えられます。

    キャンセル

  • 2018/07/20 00:52

    ご回答ありがとうございます。
    皆様のご回答を見させていただいた所、進捗率表示が仕様的に無理な気がしてきました。
    一応、まだこの質問は開いておこうと思います。

    キャンセル

0

現状のプログラムですと、サブフォルダ内のファイルを検索する際に再帰呼び出しを行っていますので、その時点でプログレスバーのMaximumが再設定されていまいます。
再帰での呼び出しから帰ってきたときに、countがMaximumを超えているのだと思います。

フォルダ以下のファイル容量を調べるのみであれば

string[] files = System.IO.Directory.GetFiles(@"C:\test", "*", System.IO.SearchOption.AllDirectories);


とすれば、上記例ですとC:\test配下のファイル全てが列挙されますので、再帰呼び出しする必要もなくなります。

どのみち、プログレスバーが再描画されるころにはMax値になっているはずなので、容量計算でループしている間は0%、計算終了で100%の表示になるだけだと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/20 00:52

    ご回答ありがとうございます。
    皆様のご回答を見させていただいた所、進捗率表示が仕様的に無理な気がしてきました。
    一応、まだこの質問は開いておこうと思います。

    キャンセル

同じタグがついた質問を見る

  • C#

    7695questions

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