Get filenames without path of a specific directory

前端 未结 8 1070
半阙折子戏
半阙折子戏 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:27

    You can get the files name of particular directory using GetFiles() method of the DirectoryInfo class. Here are sample example to list out all file and it's details of particular directory

    System.Text.StringBuilder objSB = new System.Text.StringBuilder();
        System.IO.DirectoryInfo directory = new System.IO.DirectoryInfo("d:\\");
        objSB.Append("<table>");
        objSB.Append("<tr><td>FileName</td>" + 
                     "<td>Last Access</td>" + 
                     "<td>Last Write</td>" + 
                     "<td>Attributes</td>" + 
                     "<td>Length(Byte)</td><td>Extension</td></tr>");
    
        foreach (System.IO.FileInfo objFile in directory.GetFiles("*.*"))
        {
            objSB.Append("<tr>");
    
            objSB.Append("<td>");
            objSB.Append(objFile.Name);
            objSB.Append("</td>");
    
            objSB.Append("<td>");
            objSB.Append(objFile.LastAccessTime);
            objSB.Append("</td>");
    
            objSB.Append("<td>");
            objSB.Append(objFile.LastWriteTime);
            objSB.Append("</td>");
    
            objSB.Append("<td>");
            objSB.Append(objFile.Attributes);
            objSB.Append("</td>");
    
            objSB.Append("<td>");
            objSB.Append(objFile.Length);
            objSB.Append("</td>");
    
            objSB.Append("<td>");
            objSB.Append(objFile.Extension);
            objSB.Append("</td>");
    
            objSB.Append("</tr>");
        }
        objSB.Append("</table>");
    
        Response.Write(objSB.ToString());
    

    This example display list of file in HTML table structure.

    0 讨论(0)
  • 2020-12-13 17:31

    You can just extract the file name from the full path.

    var sections = fullPath.Split('\\');
    var fileName = sections[sections.Length - 1];
    
    0 讨论(0)
  • 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

    0 讨论(0)
  • 2020-12-13 17:35

    Although several right answers are there for this questions, You may find this solution as:

    string[] files = Directory.EnumerateFiles("C:\Something", "*.*")
                     .Select(p => Path.GetFileName(p))
                     .Where(s => s.EndsWith(".bmp", StringComparison.OrdinalIgnoreCase) || s.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase)).ToArray();
    

    Thanks

    0 讨论(0)
  • 2020-12-13 17:40

    Create a DirectoryInfo object, use a search pattern to enumerate, then treat it like an array.

    string filePath = "c:\Public\";
    DirectoryInfo apple = new DirectoryInfo(@filepath);
    foreach (var file in apple.GetFiles("*")
    {
       //do the thing
       Console.WriteLine(file)
    }
    
    0 讨论(0)
  • 2020-12-13 17:41

    See Path.GetFileName:

    Returns the file name and extension of the specified path string.

    The Path Class has several useful filename and path methods.

    0 讨论(0)
提交回复
热议问题