使用.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
Run Code Online (Sandbox Code Playgroud)
。
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
。
可以说我应该对上面的代码感到满意,但这不是我今天要拍摄的内容。
提前致谢
我相信您正在寻找现有的方法 GetFileSystemInfos(string, SearchOptions)。如果您指定 AllDirectories 作为 SearchOptions 值,它将递归搜索传入的文件夹。
例如:
public static List<FileSystemInfo> GetAllFilesAndDirectories ( string dir ) {
DirectoryInfo info = new DirectoryInfo(dir);
FileSystemInfo[] all = info.GetFileSystemInfos("*", SearchOptions.AllDirectories);
return new List<FileSystemInfo>(all);
}
Run Code Online (Sandbox Code Playgroud)
如果你想把它写得很长,你可以这样做
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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2519 次 |
| 最近记录: |