編集 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()
方法はありますか?