【发布时间】:2011-04-13 18:46:04
【问题描述】:
string path = "C:\folder1\folder2\file.txt";
我可以使用哪些对象或方法得到folder2 的结果?
【问题讨论】:
-
你想要最后一个文件夹名称,所以如果你有 C:\folder1\folder2\folder3\file.txt,你想要“folder3”吗?
标签: c# path filesystems
string path = "C:\folder1\folder2\file.txt";
我可以使用哪些对象或方法得到folder2 的结果?
【问题讨论】:
标签: c# path filesystems
我可能会使用类似的东西:
string path = "C:/folder1/folder2/file.txt";
string lastFolderName = Path.GetFileName( Path.GetDirectoryName( path ) );
对GetDirectoryName 的内部调用将返回完整路径,而对GetFileName() 的外部调用将返回最后一个路径组件 - 这将是文件夹名称。
无论路径是否实际存在,这种方法都有效。但是,这种方法确实依赖于最初以文件名结尾的路径。如果不知道路径是以文件名还是文件夹名结尾 - 那么它要求您首先检查实际路径以查看文件/文件夹是否存在于该位置。在那种情况下,Dan Dimitru 的回答可能更合适。
【讨论】:
试试这个:
string filename = @"C:/folder1/folder2/file.txt";
string FolderName = new DirectoryInfo(System.IO.Path.GetDirectoryName(filename)).Name;
【讨论】:
简单干净。只使用System.IO.FileSystem - 就像一个魅力:
string path = "C:/folder1/folder2/file.txt";
string folder = new DirectoryInfo(path).Name;
【讨论】:
file.txt,而不是folder2
DirectoryInfo 完成去除目录名称的工作
string my_path = @"C:\Windows\System32";
DirectoryInfo dir_info = new DirectoryInfo(my_path);
string directory = dir_info.Name; // System32
【讨论】:
当路径中没有文件名时,我使用此代码 sn-p 获取路径的目录:
例如“c:\tmp\test\visual”;
string dir = @"c:\tmp\test\visual";
Console.WriteLine(dir.Replace(Path.GetDirectoryName(dir) + Path.DirectorySeparatorChar, ""));
输出:
视觉
【讨论】:
string Folder = Directory.GetParent(path).Name;
【讨论】:
var fullPath = @"C:\folder1\folder2\file.txt";
var lastDirectory = Path.GetDirectoryName(fullPath).Split('\\').LastOrDefault();
【讨论】:
同样重要的是要注意,在循环中获取目录名称列表时,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
【讨论】:
以下代码仅有助于获取文件夹名称
公共 ObservableCollection 项目 = 新的 ObservableCollection(); 尝试 { string[] folderPaths = Directory.GetDirectories(stemp); 项目.清除(); foreach(文件夹路径中的字符串 s) { items.Add(new gridItems { foldername = s.Remove(0, s.LastIndexOf('\\') + 1), folderpath = s }); } } 捕捉(例外一) { } 公共类gridItems { 公共字符串文件夹名称 { 获取;放; } 公共字符串文件夹路径 { 获取;放; } }【讨论】:
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);
}
}
【讨论】:
这很丑,但避免了分配:
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;
}
【讨论】: