从完整文件名路径获取文件夹名称

Posted

技术标签:

【中文标题】从完整文件名路径获取文件夹名称【英文标题】:Getting the folder name from a full filename path 【发布时间】:2011-04-13 18:46:04 【问题描述】:
string path = "C:\folder1\folder2\file.txt";

我可以使用哪些对象或方法得到folder2 的结果?

【问题讨论】:

你想要最后一个文件夹名称,所以如果你有 C:\folder1\folder2\folder3\file.txt,你想要“folder3”吗? 【参考方案1】:

我可能会使用类似的东西:

string path = "C:/folder1/folder2/file.txt";
string lastFolderName = Path.GetFileName( Path.GetDirectoryName( path ) );

GetDirectoryName 的内部调用将返回完整路径,而对GetFileName() 的外部调用将返回最后一个路径组件 - 这将是文件夹名称。

无论路径是否实际存在,这种方法都有效。但是,这种方法确实依赖于最初以文件名结尾的路径。如果不知道路径是以文件名还是文件夹名结尾 - 那么它要求您首先检查实际路径以查看文件/文件夹是否存在于该位置。在那种情况下,Dan Dimitru 的回答可能更合适。

【讨论】:

另一种解决方案:return new DirectoryInfo(fullPath).Name; @DavideIcardi 你的评论真的应该是一个答案,这是值得的。 当路径不包含文件(目录路径)时,这不起作用,而@DavideIcardi 解决方案包含。 一个有趣的部分是,如果路径是“C:/folder1/folder2./file.txt”(注意folder2末尾的点),结果将是“folder2”而不是“文件夹 2。” (这是一个完全有效的文件夹名称) 警告:这个解决方案是错误的!对于“C:/bin/logs”,它返回“bin”。使用 return new DirectoryInfo(fullPath).Name;而是。【参考方案2】:

试试这个:

string filename = @"C:/folder1/folder2/file.txt";
string FolderName = new DirectoryInfo(System.IO.Path.GetDirectoryName(filename)).Name;

【讨论】:

这是更好的答案,因为它实际上返回了 OP 问题中询问的确切结果。谢谢。【参考方案3】:

简单干净。只使用System.IO.FileSystem - 就像一个魅力:

string path = "C:/folder1/folder2/file.txt";
string folder = new DirectoryInfo(path).Name;

【讨论】:

文件夹在这种情况下是file.txt,而不是folder2【参考方案4】:

DirectoryInfo 完成去除目录名称的工作

string my_path = @"C:\Windows\System32";
DirectoryInfo dir_info = new DirectoryInfo(my_path);
string directory = dir_info.Name;  // System32

【讨论】:

【参考方案5】:

当路径中没有文件名时,我使用此代码 sn-p 获取路径的目录:

例如“c:\tmp\test\visual”;

string dir = @"c:\tmp\test\visual";
Console.WriteLine(dir.Replace(Path.GetDirectoryName(dir) + Path.DirectorySeparatorChar, ""));

输出:

视觉

【讨论】:

你可以只做 Path.GetFileName(dir) ,它会返回文件夹名称就好了。【参考方案6】:
string Folder = Directory.GetParent(path).Name;

【讨论】:

【参考方案7】:
var fullPath = @"C:\folder1\folder2\file.txt";
var lastDirectory = Path.GetDirectoryName(fullPath).Split('\\').LastOrDefault();

【讨论】:

【参考方案8】:

同样重要的是要注意,在循环中获取目录名称列表时,DirectoryInfo 类会被初始化一次,因此只允许首次调用。为了绕过此限制,请确保在循环中使用变量来存储任何单个目录的名称。

例如,此示例代码循环遍历任何父目录中的目录列表,同时将找到的每个目录名称添加到字符串类型列表中:

[C#]

string[] parentDirectory = Directory.GetDirectories("/yourpath");
List<string> directories = new List<string>();

foreach (var directory in parentDirectory)

    // Notice I've created a DirectoryInfo variable.
    DirectoryInfo dirInfo = new DirectoryInfo(directory);

    // And likewise a name variable for storing the name.
    // If this is not added, only the first directory will
    // be captured in the loop; the rest won't.
    string name = dirInfo.Name;

    // Finally we add the directory name to our defined List.
    directories.Add(name);

[VB.NET]

Dim parentDirectory() As String = Directory.GetDirectories("/yourpath")
Dim directories As New List(Of String)()

For Each directory In parentDirectory

    ' Notice I've created a DirectoryInfo variable.
    Dim dirInfo As New DirectoryInfo(directory)

    ' And likewise a name variable for storing the name.
    ' If this is not added, only the first directory will
    ' be captured in the loop; the rest won't.
    Dim name As String = dirInfo.Name

    ' Finally we add the directory name to our defined List.
    directories.Add(name)

Next directory

【讨论】:

【参考方案9】:

以下代码仅有助于获取文件夹名称

公共 ObservableCollection 项目 = 新的 ObservableCollection(); 尝试 string[] folderPaths = Directory.GetDirectories(stemp); 项目.清除(); foreach(文件夹路径中的字符串 s) items.Add(new gridItems foldername = s.Remove(0, s.LastIndexOf('\\') + 1), folderpath = s ); 捕捉(例外一) 公共类gridItems 公共字符串文件夹名称 获取;放; 公共字符串文件夹路径 获取;放;

【讨论】:

【参考方案10】:

Ainda estou aprendendo a como usar o c#, mas fui pegando uns códigos de uns e de outros, espero que te ajude...

using System;
using System.IO;
using System.Collections.Generic;

class AudioMerge

    static void Main()
        string destino="";
        Console.WriteLine("Digite a pasta de origem dos arquivos a serem mesclados: ");
        string origem = Console.ReadLine();
        Console.WriteLine("Insira o nome do arquivo resultado da mescla dos arquivos: ");
        string arquivo_mesclado = Console.ReadLine();
        Console.WriteLine("Deseja copiar os arquivos antes de terem sido mesclados? [s/n]");
        char opcao = char.Parse(Console.ReadLine());
        opção:
        switch(opcao)
            case 's':
            case 'S':
                Console.WriteLine("Agora, digite a pasta de destino dos arquivos que serão mesclados, para saber a ordem deles: ");
                destino = Console.ReadLine();
                break;
            case 'n':
            case 'N':
                Console.WriteLine("Os arquivos mesclados não serão copiados.");
                break;
            default:
                Console.WriteLine("A opção não foi escolhida corretamente");
                goto opção;
        
        
        arquivo_mesclado = origem + @"\" + arquivo_mesclado + @".mp3";
        MergeAudio(origem, arquivo_mesclado, destino, opcao);
    
    static void MergeAudio(string origem, string arquivo_mesclado, string destino, char opcao)
        //string path = @"C:\Users\Josileissu\Desktop\teste";
        string [] filePaths = Directory.GetFiles(origem, "*.*", SearchOption.AllDirectories);
        int count = 0;

        using (var w = new  BinaryWriter(File.Create(arquivo_mesclado)))
            new List<string>(filePaths).ForEach(f => w.Write(File.ReadAllBytes(f)));
        
        
         //copia arquivo na pasta output;
        opção:
        switch(opcao)
            case 's':
            case 'S':
                foreach(string n in filePaths)
                    count++; //contagem de arquivos
                    string nomepasta = new DirectoryInfo(System.IO.Path.GetDirectoryName(n)).Name; //cd00_início
                    string nomearquivo = new DirectoryInfo(n).Name; //faixa01.mp3
                    nomearquivo = nomepasta + "_" + nomearquivo;
                    string str = (destino + @"\" + nomearquivo);
                    if (!File.Exists(str))
                        File.Copy(n , str);
                        Console.WriteLine(n + "copiado para ->" + str);
                    
                
                Console.WriteLine("A quantidade de arquivos copiados foram: Pelo contador 0, e pelo tamanho do array 1",count, filePaths.Length);
                break;
            case 'n':
            case 'N':
                break;
            default:
                Console.WriteLine("A opção não foi escolhida corretamente");
                goto opção;
        
        Console.WriteLine("O arquivo final foi destinado a pasta 0",arquivo_mesclado);
    

【讨论】:

欢迎来到 Stack Overflow。请仅使用英语参与,或尝试Stack Overflow em Português。 请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。【参考方案11】:

这很丑,但避免了分配:

private static string GetFolderName(string path)

    var end = -1;
    for (var i = path.Length; --i >= 0;)
    
        var ch = path[i];
        if (ch == System.IO.Path.DirectorySeparatorChar ||
            ch == System.IO.Path.AltDirectorySeparatorChar ||
            ch == System.IO.Path.VolumeSeparatorChar)
        
            if (end > 0)
            
                return path.Substring(i + 1, end - i - 1);
            

            end = i;
        
    

    if (end > 0)
    
        return path.Substring(0, end);
    

    return path;

【讨论】:

以上是关于从完整文件名路径获取文件夹名称的主要内容,如果未能解决你的问题,请参考以下文章

PHP 从名称或完整路径获取文件扩展名

从名称或完整路径获取文件扩展名

获取Golang中给定文件路径的目录名称(不是路径)

如何使用c#从google驱动器api获取文件夹的完整路径

Android:如何在状态栏中获取电池图标资源 ID 或完整文件路径/名称?

批量获取文件名称和路径