0

最近、PC をスキャンするためのデスクトップ ベースのアプリケーションの作成を開始しました。私はこれを達成しました、そしてそれはうまくいきます。ただし、アプリケーションが実行したスキャンの進行状況をユーザーが知ることができるように、進行状況バーを追加したいと思います。

最小値と最大値がわかっている通常の機能にプログレス バーを使用する作業を行いました。しかし、スキャン プロセス中に最小値が 0 になっていますが、どうすれば最大値を推定できますか?

特定のドライブ内のすべてのファイルを数えてみましたが、それほど効率的ではなく、アクセスが拒否されたディレクトリがほとんどありません。では、スキャンの最大値を取得するにはどうすればよいでしょうか。この特定の状況で進行状況バーを機能させるにはどうすればよいですか。プロセスが終了すると進行状況バーも終了段階にある多くのアプリケーションを見てきました。

4

2 に答える 2

0

ドライブの合計バイト数と容量を考慮してから、処理したばかりのファイルのサイズ (バイト単位) を使用すると、処理するバイト数の進行状況を表示できます。これは、ディスク全体をバックアップする場合にのみ機能します。

ここでは、 backgroundworkerprogressbarを使用する WinForms タイプのアプリのより完全で実用的な例を示します。ディスク サイズはすぐに利用できるため、開始時のペナルティはありません。

private long diskSizeInGB = 1;
const long GB = 1024 * 1024 * 1024;
long filesizesProcessedInGB = 0;

private void button4_Click(object sender, EventArgs e)
{
    // get drive info
    var cdrive = DriveInfo.GetDrives().First(d => d.Name == @"C:\");
    // calculate max used bytes
    diskSizeInGB = (cdrive.TotalSize - cdrive.TotalFreeSpace) / GB;
    // backupprocess, async!
    bgwScan.RunWorkerAsync();
}

private void bgwScan_DoWork(object sender, DoWorkEventArgs e)
{
    Scanner(@"C:\"); // start scaning/backuping/copying recursively
}

void Scanner(string path)
{
    foreach (var file in Directory.EnumerateFiles(path, "*.*"))
    {
        var fileInfo = new FileInfo(file);
        filesizesProcessedInGB += (fileInfo.Length / GB);  
        // Copy / backup / whatever you want with a file
    }
    // calculate progress percentager and report
    bgwScan.ReportProgress((int)(100 * filesizesProcessedInGB / diskSizeInGB));

    foreach (var dir in Directory.EnumerateDirectories(path))
    {
        try
        {
            Scanner(dir);
        }
        catch (Exception)
        {
            Trace.WriteLine(dir + " error");
        }
    }
}

private void bgwScan_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // update progressbar
    progressBar1.Value = e.ProgressPercentage;
}
于 2013-09-14T14:45:02.470 に答える
0

プログレス バーには、タスクの完了率が表示されます。

Directory.EnumerateFiles(drivePath, "*.mp3", SearchOption.AllDirectories).Count() 

これは軽量化です。

于 2013-09-14T14:04:33.267 に答える