Get filenames without path of a specific directory

前端 未结 8 1073
半阙折子戏
半阙折子戏 2020-12-13 16:44

How can I get all filenames of a directory (and its subdirectorys) without the full path? Directory.GetFiles(...) returns always the full path!

8条回答
  •  一整个雨季
    2020-12-13 17:34

    You can extract the filename from full path.

    .NET 3, filenames only

    var filenames3 = Directory
                    .GetFiles(dirPath, "*", SearchOption.AllDirectories)
                    .Select(f => Path.GetFileName(f));
    

    .NET 4, filenames only

    var filenames4 = Directory
                    .EnumerateFiles(dirPath, "*", SearchOption.AllDirectories)
                    .Select(Path.GetFileName); // <-- note you can shorten the lambda
    

    Return filenames with relative path inside the directory

    // - file1.txt
    // - file2.txt
    // - subfolder1/file3.txt
    // - subfolder2/file4.txt
    
    var skipDirectory = dirPath.Length;
    // because we don't want it to be prefixed by a slash
    // if dirPath like "C:\MyFolder", rather than "C:\MyFolder\"
    if(!dirPath.EndsWith("" + Path.DirectorySeparatorChar)) skipDirectory++;
    
    var filenames4s = Directory
                    .EnumerateFiles(dirPath, "*", SearchOption.AllDirectories)
                    .Select(f => f.Substring(skipDirectory));
    

    confirm in LinqPad...

    filenames3.SequenceEqual(filenames4).Dump(".NET 3 and 4 methods are the same?");
    
    filenames3.Dump(".NET 3 Variant");
    filenames4.Dump(".NET 4 Variant");
    filenames4s.Dump(".NET 4, subfolders Variant");
    

    Note that the *Files(dir, pattern, behavior) methods can be simplified to non-recursive *Files(dir) variants if subfolders aren't important

提交回复
热议问题