从完整文件名路径获取文件夹名称
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;
【讨论】:
以上是关于从完整文件名路径获取文件夹名称的主要内容,如果未能解决你的问题,请参考以下文章