我使用此代码获取目录名称:
void DirSearch(string sDir)
{
foreach (var d in System.IO.Directory.GetDirectories(sDir))
{
ListBox1.Items.Add(System.IO.Path.GetDirectoryName(d));
DirSearch(d);
}
}
但它没有获取目录名称。例如:“NewFolder1”,获取:“D:\ aaa \ bbbb \ cccc \ dddd \ NewFolder1”。
我只获得目录名称。
答案 0 :(得分:11)
这应该有效:
foreach (var d in System.IO.Directory.GetDirectories(@"C:\"))
{
var dir = new DirectoryInfo(d);
var dirName = dir.Name;
ListBox1.Items.Add(dirName);
}
另外,你可以快捷方式......
foreach (var d in System.IO.Directory.GetDirectories(@"C:\"))
{
var dirName = new DirectoryInfo(d).Name;
ListBox1.Items.Add(dirName);
}
我刚用 C 的路线进行测试。
答案 1 :(得分:1)
目前您正在使用Directory.GetDirectories
,它将返回string[]
,其中包含目录的完整路径。而是使用DirectoryInfo
类,稍后您可以使用属性DirectoryInfo.Name
来获取仅目录的名称而不是完整路径,如:
void DirSearch(string sDir)
{
DirectoryInfo dirInfo = new DirectoryInfo(sDir);
foreach (var d in dirInfo.GetDirectories("*", SearchOption.AllDirectories))
{
ListBox1.Items.Add(d.Name);
}
}
您似乎也尝试以递归方式搜索所有子目录,您可以使用代码中的SearchOption.AllDirectories
来包含所有子目录。
答案 2 :(得分:1)
如果您不想创建有时会导致错误并引入额外开销的DirectoryInfo
或FileInfo
类,您可以这样做:
void DirSearch(string sDir)
{
foreach (var d in System.IO.Directory.GetDirectories(sDir))
{
ListBox1.Items.Add(d.TrimEnd(Path.DirectorySeparatorChar).Split(Path.DirectorySeparatorChar).Last());
DirSearch(d);
}
}
根据您正在搜索的目录的数量和大小,它的发型也会更快......
如果你不需要跨平台/可以始终保证文件系统有一个斜杠分隔符,你可以使它变得更短" /更简洁。
void DirSearch(string sDir)
{
foreach (var d in System.IO.Directory.GetDirectories(sDir))
{
ListBox1.Items.Add(d.TrimEnd('\\').Split('\\').Last());
DirSearch(d);
}
}
答案 3 :(得分:1)
我们少使用linq
:
ListBox1.Items.AddRange(System.IO.Directory.GetDirectories(@"C:\").Select(x => new DirectoryInfo(x).Name).ToArray());
小菜一碟:D
答案 4 :(得分:1)
有一个简单的单线:
owner
答案 5 :(得分:0)
但它没有获取目录名称。例如:" NewFolder1",得到:" D:\ aaa \ bbbb \ cccc \ dddd \ NewFolder1"。
GetDirectoryName
返回目录的完整路径(它也可以用于文件)但是你只想要最后一部分,所以你的例子中是NewFolder1
?
您可以使用DirectoryInfo.Name
string dir = @"D:\aaa\bbbb\cccc\dddd\NewFolder1";
DirectoryInfo dirInfo = new DirectoryInfo(dir);
string nameOfDirOnly = dirInfo.Name; // NewFolder1
ListBox1.Items.Add(nameOfDirOnly);
答案 6 :(得分:0)
这里有一些适合你的东西......
public IEnumerable<string> GetDirInfoFast(string dir, string pattern)
{
//you should put try catch here....
var di = new DirectoryInfo(dir);
var list = new List<string>();
//put in the pattern
var dirs = di.GetDirectories(pattern);
Parallel.ForEach(dirs, p => {
list.Add(p.Name);
});
return list;
}
答案 7 :(得分:0)
这对我也有用:
var directoryName = Path.GetFileName(directoryPath);