使用.NET 3.0,我得到了下面的方法,它可以正确地返回指定目录的所有文件和目录(和子目录)的集合。如果可能的话,我想把它简化为只使用我非常熟悉的结构。具体地说,以下是我不清楚的事情:
1. IEnumerable<FileSystemInfo>: I'd like to return List<FileSystemInfo> instead
2. Stack<FileSystemInfo>: I'd list to use List<FileSystemInfo> instead.
3. yield return: I've never used this before。
public static IEnumerable<FileSystemInfo> GetAllFilesAndDirectories ( string dir ) {
DirectoryInfo dirInfo = new DirectoryInfo( dir );
Stack<FileSystemInfo> stack = new Stack<FileSystemInfo>();
stack.Push( dirInfo );
while ( dirInfo != null || stack.Count > 0 ) {
FileSystemInfo fileSystemInfo = stack.Pop();
DirectoryInfo subDirectoryInfo = fileSystemInfo as DirectoryInfo;
if ( subDirectoryInfo != null ) {
yield return subDirectoryInfo;
foreach ( FileSystemInfo fsi in subDirectoryInfo.GetFileSystemInfos() ) {
stack.Push( fsi );
}
dirInfo = subDirectoryInfo;
} else {
yield return fileSystemInfo;
dirInfo = null;
}
}
}。
可以这样说,我应该对上面的代码感到满意,但这不是我今天要做的。
提前感谢
发布于 2009-10-10 03:44:41
我相信您正在寻找现有的方法GetFileSystemInfos(string,SearchOptions)。如果您指定SearchOptions值为AllDirectories,它将递归地搜索传入的文件夹。
例如:
public static List<FileSystemInfo> GetAllFilesAndDirectories ( string dir ) {
DirectoryInfo info = new DirectoryInfo(dir);
FileSystemInfo[] all = info.GetFileSystemInfos("*", SearchOptions.AllDirectories);
return new List<FileSystemInfo>(all);
}如果你想把它写出来,你可以这样做
public static List<FileSystemInfo> GetAllFilesAndDirectories ( string dir ) {
int i = 0;
List<DirectoryInfo> toProcess = new List<DirectoryInfo>();
List<FileSystemInfo> list = new List<FileSystemInfo>();
toProcess.Add(new DirectoryInfo(dir));
while ( i < toProcess.Count ) {
DirectoryInfo curDir = toProcess[i];
foreach ( FileSystemInfo curFile in curDir.GetFileSystemInfos() ) {
list.Add(curFile);
DirectoryInfo maybe = curFile as DirectoryInfo;
if ( maybe != null ) {
toProcess.Add(maybe);
}
i++;
}
return list;
}
FileSystemInfo[] all = info.GetFileSystemInfos("*", SearchOptions.AllDirectories);
return new List<FileSystemInfo>(all);
}发布于 2009-10-10 03:50:41
这是我能想到的最短的方法:
static List<FileSystemInfo> GetAllFilesAndDirectories(string dir)
{
DirectoryInfo dirInfo = new DirectoryInfo(dir);
List<FileSystemInfo> allFilesAndDirectories = new List<FileSystemInfo>();
allFilesAndDirectories.AddRange(dirInfo.GetFiles("*", SearchOption.AllDirectories));
allFilesAndDirectories.AddRange(dirInfo.GetDirectories("*", SearchOption.AllDirectories));
return allFilesAndDirectories;
}它将返回从给定路径开始的所有级别的所有文件和目录的列表。它返回它们的顺序是所有文件,然后是所有目录。
发布于 2009-10-10 05:00:04
public List<Object> GetFilesAndDirectories(string path)
{
List<Object> lst = new List<Object>();
string[] dirs = null;
try
{
dirs = Directory.GetDirectories(path);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
foreach (string d in dirs)
{
string[] files = null;
try
{
files = Directory.GetFiles(d);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
foreach (string f in files)
{
lst.Add(f);
}
lst.Add(d);
lst.AddRange(GetFilesAndDirectories(d));
}
return lst;
}
List<Object> stuff = GetFilesAndDirectories(someRoot);https://stackoverflow.com/questions/1546964
复制相似问题