【问题标题】: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”吗?

标签: c# path filesystems


【解决方案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;
            }
            

            【讨论】:

              猜你喜欢
              • 2011-07-10
              • 1970-01-01
              • 2018-04-21
              • 1970-01-01
              • 1970-01-01
              • 2011-01-25
              • 1970-01-01
              • 2016-01-31
              相关资源
              最近更新 更多