2

以下は、バックグラウンドワーカーに出荷したいメソッドですが、メソッドの作成方法に基づいてそれを行う方法に苦労しています。あなたができるように、大丈夫なものは何も返しませんが、呼び出されるたびに directoryInfo オブジェクトが必要です。

    private void getSizeForTargetDirectory(DirectoryInfo dtar)
    { 
        // generate a collection of objects. files comes first and then directories.

        foreach (Object item in collection )
        {
            if (item == file)
            {
               track the size of the files as you encounter.
            }
            else if (item == directory)
            {
                // found a new directory, recall the method. !!!
            }
        }
    }

バックグラウンドワーカーを使用するのはこれが初めてなので、少し行き詰まっています。ここで見つかったヘルプのおかげで何かを実装しようとしましたが、メソッドが再帰的であることに気付いたときに行き詰まりました。

ビジー ループ中に進行状況を表示するにはどうすればよいですか?

doWork イベント ハンドラー メソッドを実装しましたが、下位のサブレベルで処理するファイルやフォルダーがさらにある場合は、何らかの方法でメソッドを呼び出す必要があることに気付きました。

現在選択されているノードがディレクトリの場合、'getSizeForTargetDirectory()' メソッドを呼び出す単純なボタン クリック イベント ハンドラがあります。

 private void retrieveInfoButton_Click(object sender, EventArgs e)
    {
        // check to see if the path is valid
        // reset the labels and textfields.
        string fullPath = treeDrives.SelectedNode.FullPath;
        string sNodesName = treeDrives.SelectedNode.Text;

        if (directory) // Enter here if its a directory.
        {
            string parentPath = treeDrives.SelectedNode.Parent.FullPath;
            DirectoryInfo[] dirArray = populateFoldersArray(parentPath);

            for (int i = 0; i < dirArray.Length; i++)
            {
                if (dirArray[i].Name == sNodesName)
                {
                    getSizeForTargetDirectory(dirArray[i]);

                    // do work !

うまくいけば、それが私がやろうとしていることと、それをどのように行っているかを説明しています. 質問は、出荷しようとしている作業の大部分が再帰的なメソッドから来ているときに、バックグラウンド ワーカー クラスの進行状況レポート機能をどのように使用できるかです。

初期のテストを通じて、いくつかの調整を行った後、getSize メソッドが非常に効率的であり、現在提供されているフォルダーのサイズ情報を非常に迅速に報告したことに気付きましたが、非常に強力な開発マシンを使用しているため、すべてのユーザーに当てはまるとは限りません。

読んでくれてありがとう、誰かが助けてくれることを願っています!!!

4

3 に答える 3

3

組み込みメソッドを使用するか、再帰検索オプションを使用してすべてのディレクトリまたはファイルを取得するDirectory方がはるかに簡単だと思います。DirectoryInfo

public partial class Form1 : Form
{
    private Action<float> updateProgMethod;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        updateProgMethod = UpdateProgress;
    }

    private void GetDirectorySizeAsync(string path)
    {
        backgroundWorker.RunWorkerAsync(path);
    }

    private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        DirectoryInfo di = new DirectoryInfo((string)e.Argument);
        di.GetTotalSize(ProgressCallback);
    }

    // Takes callbacks from the GetTotalSize() method
    private void ProgressCallback(float p)
    {
        // Invokes update progress bar on GUI thread:
        this.BeginInvoke(updateProgMethod, new object[] { p });
    }

    // Actually updates the progress bar:
    private void UpdateProgress(float p)
    {
        progressBar.Value = (int)(p * (progressBar.Maximum - progressBar.Minimum)) + progressBar.Minimum;
    }
}

public static class IOExtensions
{
    public static long GetTotalSize(this DirectoryInfo directory, Action<float> progressCallback)
    {
        FileInfo[] files = directory.GetFiles("*.*", SearchOption.AllDirectories);
        long sum = 0;
        int countDown = 0;
        for (int i = 0; i < files.Length; i++)
        {
            sum += files[i].Length;
            countDown--;
            if (progressCallback != null && countDown <= 0)
            {
                countDown = 100;
                progressCallback((float)i / files.Length);
            }
        }
        return sum;
    }
}

最初にファイルやフォルダーの数を知らずに進行状況を推測するのは困難です!

編集: コードを少し改善しました。

于 2009-08-26T13:54:09.477 に答える
2

メソッドを呼び出すときに、メソッドにかかる時間や個別のステップがいくつ含まれるかがわからない場合、メソッドの実行中に進行状況バーを表示する方法はありません。

私の意見では、プログレス バーの目的は、タスクがいつ完了するかについて信頼できる情報を提供することではありません。むしろ、目的は、プログラムがロックされて何もしていないとユーザーが考えて操作全体を取り消さないようにすることです。

ディレクトリとサブディレクトリを繰り返し処理しているため、ここでのより簡単なアプローチは、現在のディレクトリをラベルに表示することです。これにより、ユーザーは物事が起こっているというリラックスした感覚を得ることができ、ディレクトリがすべてアルファベット順に並べられている場合、操作の全体的な進行状況を自分で判断することさえできます.

于 2009-08-26T13:54:35.140 に答える
0

到達するまでゴールがわからないので、どこまで到達したかを報告します。呼び出しごとに1回実行します。おそらく、これまでに見たファイルの数とディレクトリの数。

于 2009-08-26T14:01:34.400 に答える