1

編集 2012 年 8 月 8 日: 使用しているコードにいくつかの重要な変更を加えました。私が抱えている最後の問題について新たな助けが必要です。この質問のほとんどを書き直します。

特定の文字の名前をチェックするターゲットディレクトリの下の各ファイルとフォルダーを再帰的に反復する小さなプログラムがあります。問題なく動作しますが、特定のメソッドをより高速に動作させる方法についてのヘルプを探しています。

これが私が現在使用しているコードです。これは、すべてを開始するメソッドのほんの数行です。

if(getFullList(initialPathTB.Text))
            SearchFolder();  

そして、これらはあなたが見る必要がある2つの方法です:

private void SearchFolder()
{
    int      newRow;
    int      numItems = 0;

    numItems = itemsMaster.Length;

    for (int x = 0; x < numItems; x++)
    {
        if (hasIllegalChars(itemsMaster[x]) == true)
        {
            newRow = dataGridView1.Rows.Add();
            dataGridView1.Rows[newRow].Cells[0].Value = itemsMaster[x];
            filesFound++;
        }
    }
}

private bool getFullList(string folderPath)
{
    try
    {
        if (checkBox17.Checked)
            itemsMaster = Directory.GetFileSystemEntries(folderPath, "*", SearchOption.AllDirectories);
        else
            itemsMaster = Directory.GetFileSystemEntries(folderPath, "*", SearchOption.TopDirectoryOnly);
        return true;
    }
    catch (UnauthorizedAccessException e)
    {
        if(folderPath[folderPath.Length - 1] != '\\')
            folderPath += @"\";
        if (e.Message == "Access to the path '" + folderPath + "' is denied.")
        {
            MessageBox.Show("You do not have read permission for the following directory:\n\n\t" + folderPath + "\n\nPlease select another folder or log in as a user with read access to this folder.", "Access Denied", MessageBoxButtons.OK, MessageBoxIcon.Error);
            folderPath = folderPath.Substring(0, folderPath.Length - 1);
        }
        else
        {
            if (accessDenied == null)
                accessDenied = new StringBuilder("");
            accessDenied.AppendLine(e.Message.Substring(20, e.Message.Length - 32));
        }
        return false;
    }
}

initialPathTB.Text「F:\COMMON\Administration」のようなものが取り込まれます。

これが私の問題です。 渡された最上位レベルがfolderPath、ユーザーが読み取りアクセス権を持っていない場合、すべて正常に動作します。最上位およびすべての下位ディレクトリが、ユーザーが読み取りアクセス権を持つフォルダーである場合、すべてが再び正常に機能します。この問題は、ユーザーが最上位レベルへの読み取りアクセス権を持っているディレクトリにあり、下位の子フォルダーにはアクセス権を持っていません。getFullList()これがブール値である理由です。UnauthorizedAccessExceptions がある場合は、itemsMaster空のままでSearchFolder()失敗しnumItems = itemsMaster.Length;ます。

私が望むのは、itemsMaster内部のすべてのアイテムを入力しfolderPath、ユーザーが読み取りアクセス権を持っていないアイテムを単純にスキップすることですが、各ディレクトリを再帰的にクロールしてチェックすることなくそれを行う方法がわかりません。

このコードは、以前の方法よりもはるかに高速に動作するため、別の方法で完全に放棄したくありません。メソッドに私が望むことをさせるDirectory.GetFileSystemEntries()方法はありますか?

4

2 に答える 2

2
Directory.GetFileSystemEntries(folderPath, "*", SearchOption.AllDirectories).Length

または別のオプション(このオプションを使用すると、の最初の3〜5個の要素がfullstring出力からのガベージテキストになり、削除する必要があることに注意してください):

Process process = new Process();
List<string> fullstring = new List<string>();

process.StartInfo.FileName = "cmd.exe";
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.UseShellExecute = false;
process.OutputDataReceived += (sender, args2) => fullstring.Add(args2.Data);

process.Start();

process.StandardInput.WriteLine(@"dir /b /s c:\temp | find """" /v");
process.BeginOutputReadLine();

process.WaitForExit(10000); //or whatever is appropriate time

process.Close();

エラーをより正確に追跡したい場合は、次の変更を行ってください。

グローバルに宣言List<string> fullstring = new List<string>();してから、次のようなイベントハンドラーを変更しOutputDataReceivedます。

    process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
}

static void process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    try
    {
        fullstring.Add(e.Data);
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.ToString());
        //log exception
    }
}
于 2012-07-19T20:57:36.970 に答える
1

あなたは、「プログレス バーに実際にプログラムがアイテム リストのどこまで進んでいるかを示すようにしたいので、ProgressBar.Maximum プロパティを設定するアイテムの数が必要です」と書いています。

これは一種の特定の欲求であり、特定の場合に価値があるかどうかはわかりません。ProgressBar の幅が (たとえば) 800 ピクセルの場合、1 パーセント ポイントは幅 0.125 ピクセルになります。「10 万項目を超える」リストの場合 (最小値を 100,000 にしましょう)、バーを移動して 1 ピクセルを移動するには、8,000 項目を処理する必要があります。プログラムが 8,000 個のアイテムを処理するのにかかる時間は? これは、ユーザーに提供している実際のフィードバックの種類を理解するのに役立ちます。時間がかかりすぎると、動作していてもハングしたように見えることがあります。

良いユーザー フィードバックをお探しの場合は、ProgressBar のスタイルを Marquee に設定し、"ファイル # xをチェック中" というテキスト インジケーターを提供することをお勧めします。

于 2012-07-19T21:32:46.577 に答える