0

私は次のコードを使用しています

var allFolderPaths = Directory.EnumerateDirectories(this.sourceFolder, "*.*", SearchOption.AllDirectories);

私が抱えている問題は、foreachループ(上記のようにallFolderPaths変数を反復処理)中に、ディレクトリが見つからないために失敗することです。

さて、次のコードは、それ自体ではディレクトリなどを調べておらず、単なる文字列ループです。

foreach (string folder in StringList)
{
       /dostuff 
}

ただし、allFolderPathsを使用するようにコードを更新すると(この投稿の最初の例のように)

foreach (string folder in allFolderPaths)
{
       /dostuff 
}

「パスへのアクセスが拒否された」ために失敗します。

それで、これは、変数allFolderPathsが割り当てられた時点で実際に「割り当てられていない」ことを意味しますか(それが意味をなす場合)?

4

3 に答える 3

2

Directory.EnumerateFiles()は、実際に列挙可能なものを列挙した場合にのみ「実行」されるIEnumerable <>を返します...(別名「レイジー実行」)。

EnumerateFilesをすぐに実行するように強制する場合は、.ToList()(別名「メモ化」)を追加できます。

例:

  var allFolders = Directory.EnumerateDirectories(this.sourceFolder, "*.*", SearchOption.AllDirectories).ToList();

AccessDenied例外の理由は、列挙する権限がないディレクトリを列挙しようとしているためです。「マイドキュメント」などをお探しですか?

于 2012-10-28T14:10:28.053 に答える
1

いいえ、プロセスが権限のないファイル/ディレクトリにアクセスしようとしていることを意味します。

于 2012-10-28T14:06:27.437 に答える
1

コード内のallFolderPaths変数はタイプIEnumerable<string>です。これは、foreachループでディスクの列挙を開始するまで、ディスクにアクセスしないことを意味します。

このコンテキストでの「ディレクトリが見つかりません」という例外は、その名前が1ミリ秒前に取得されたため、ほとんどありません。ただし、完全に不可能というわけではありませんが、他のプロセスがディスクにアクセスすると、ファイルシステムがオンザフライで変更される可能性があります。

「アクセスが拒否されました」という例外は、特にドライブのルートディレクトリを反復処理する場合に発生する可能性が高くなります。「システムボリューム情報」フォルダには、管理者でもアクセスできません。この例外をキャッチして続行する必要があります。それらを回避する良い方法は、DirectoryInfo.Attributesを使用することです。ディレクトリがHiddenandSystemの場合、ほとんどの場合、そのようなディレクトリから離れることができます。

于 2012-10-28T14:16:21.557 に答える