134

ディレクトリとそのディレクトリのサブディレクトリに含まれるすべてのファイルとディレクトリを一覧表示したいと考えています。ディレクトリとして C:\ を選択した場合、プログラムは、アクセスできるハード ドライブ上のすべてのファイルとフォルダーのすべての名前を取得します。

リストは次のようになります

fd\1.txt
fd\2.txt
fd\a\
fd\b\
fd\a\1.txt
fd\a\2.txt
fd\a\a\
fd\a\b\
fd\b\1.txt
fd\b\2.txt
fd\b\a
fd\b\b
fd\a\a\1.txt
fd\a\a\a\
fd\a\b\1.txt
fd\a\b\a
fd\b\a\1.txt
fd\b\a\a\
fd\b\b\1.txt
fd\b\b\a
4

17 に答える 17

65

Directory.GetFileSystemEntries.NET 4.0 以降に存在し、ファイルとディレクトリの両方を返します。次のように呼び出します。

string[] entries = Directory.GetFileSystemEntries(path, "*", SearchOption.AllDirectories);

アクセス権のないサブディレクトリの内容を一覧表示しようとする試みには対応しないことに注意してください (UnauthorizedAccessException) が、ニーズには十分である可能性があります。

于 2014-05-09T17:48:49.320 に答える
18

GetDirectoriesメソッドとメソッドを使用してGetFiles、フォルダーとファイルを取得します。

を使用して、サブフォルダー内のフォルダーとファイルも取得します。SearchOption AllDirectories

于 2012-09-08T16:31:15.230 に答える
4

残念ながら、GetFilesメソッドはファイルのリストを返しますが、ディレクトリは返しません。質問のリストは、結果にフォルダーも含める必要があることを示しています。さらにカスタマイズされたリストが必要な場合は、GetFilesand をGetDirectories再帰的に呼び出してみてください。これを試して:

List<string> AllFiles = new List<string>();
void ParsePath(string path)
{
    string[] SubDirs = Directory.GetDirectories(path);
    AllFiles.AddRange(SubDirs);
    AllFiles.AddRange(Directory.GetFiles(path));
    foreach (string subdir in SubDirs)
        ParsePath(subdir);
}

ヒント:特定の属性を確認する必要がある場合はFileInfo、クラスを使用できます。DirectoryInfo

于 2013-08-21T07:10:34.773 に答える
1

遅い答えですが、誰かが恩恵を受けると思います。エラー処理をサポートし、相対パスを返すスタックベースの反復バージョン スターター:

private static IEnumerable<string> TryEnumerate(Func<IEnumerable<string>> action)
{
    try
    {
        return action.Invoke();
    }
    catch
    {
       //TODO logging
       return Enumerable.Empty<string>();
    }
}

private static IEnumerable<string> FindFilesAndDirectories(string dir, bool returnRelativePaths = false, string filePattern="*.*")
{
    var searchStack = new Stack<string>();
    searchStack.Push(dir);
    var initialDirectory = new DirectoryInfo(dir).FullName;
    var initialDirLength = initialDirectory.Length;

    while (searchStack.Count > 0)
    {
        var currentDirectory = searchStack.Pop();
            
        yield return (returnRelativePaths && 
                string.Compare(currentDirectory, initialDirectory, StringComparison.OrdinalIgnoreCase) != 0) ? 
                 currentDirectory.Substring(initialDirLength) : currentDirectory;

        foreach (var file in TryEnumerate(() =>
                 Directory.EnumerateFiles(currentDirectory, filePattern)))
        {
            yield return returnRelativePaths ? file.Substring(initialDirLength) : file;
        }

        foreach (var directory in TryEnumerate(() =>
                 Directory.EnumerateDirectories(currentDirectory, filePattern)))
        {
            searchStack.Push(directory);
        }
    }
}

static void Main(string[] args)
{
    foreach (var result in FindFilesAndDirectories(@"c:\", true))
    {
        Console.WriteLine(result);
    }
}
于 2021-09-13T13:08:25.410 に答える
0

ディレクトリ ツリー内のサブフォルダーにアクセスできない場合、Directory.GetFiles は停止して例外をスローし、受信文字列 [] に null 値が返されます。

ここで、この回答を参照して ください https://stackoverflow.com/a/38959208/6310707

ループ内で例外を管理し、フォルダー全体がトラバースされるまで処理を続けます。

于 2016-08-15T16:48:06.637 に答える
0
using System.IO;
using System.Text;
string[] filePaths = Directory.GetFiles(@"path", "*.*", SearchOption.AllDirectories);
于 2015-02-10T07:52:06.327 に答える
-1

文字列のリストを作成

    public static List<string> HTMLFiles = new List<string>();

 private void Form1_Load(object sender, EventArgs e)
        {

     HTMLFiles.AddRange(Directory.GetFiles(@"C:\DataBase", "*.txt"));
            foreach (var item in HTMLFiles)
            {
                MessageBox.Show(item);
            }

}
于 2019-09-14T15:23:06.557 に答える