写入包含子目录的目录列表 <String>
Writing List<String> of Directories with Subdirectories
现在,我知道 Whosebug 上已经有很多关于文件夹递归和获取文件夹(包括它的子目录等)的问题,pp.,但我没有找到与我在这里遇到的问题相关的任何问题.
我的问题如下:
我从 here(页面底部)获取了有关文件夹递归的代码片段,并根据我的需要对其进行了调整;也就是说,让它不将所有(子)目录写入控制台,而是将它们添加到列表中。这是我的代码(注意被注释掉的部分):
private static List<String> ShowAllFoldersUnder(string path)
{
var folderList = new List<String>();
try
{
if ((File.GetAttributes(path) & FileAttributes.ReparsePoint)
!= FileAttributes.ReparsePoint)
{
foreach (string folder in Directory.GetDirectories(path))
{
folderList.Add(folder);
// Console.WriteLine(folder);
ShowAllFoldersUnder(folder);
}
}
}
catch (UnauthorizedAccessException) { }
return folderList;
}
我是这样称呼它的(Dir
是一个包含路径的 string
):
var _folders = ShowAllFoldersUnder(Dir);
foreach (string folder in _folders)
{
Console.WriteLine(folder);
}
问题是只有第一级文件夹被添加到列表中,这意味着我的输出是例如:
[...]
C:\Users\Test\Pictures
C:\Users\Test\Recent
C:\Users\Test\Saved Games
C:\Users\Test\Searches
C:\Users\Test\SendTo
[...]
如果我从方法中取消注释 Console.WriteLine(folder);
,它会将所有(子)目录回显到控制台:
[...]
C:\Users\Test\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned
C:\Users\Test\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\ImplicitAppShortcuts
C:\Users\Test\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar
C:\Users\Test\AppData\Roaming\Microsoft\Internet Explorer\UserData
C:\Users\Test\AppData\Roaming\Microsoft\Internet Explorer\UserData\Low
C:\Users\Test\AppData\Roaming\Microsoft\MMC
C:\Users\Test\AppData\Roaming\Microsoft\Network
[...]
在花了数小时研究可能是我的错误之后,我感到很绝望。有没有人知道是什么导致了我的问题?
方法 ShowAllFoldersUnder
returns 一个字符串列表,但唯一一次真正用它做某事是在 'main' 方法中,您将它们写入Console
.
你需要改变
ShowAllFoldersUnder(folder);
到
folderList.AddRange(ShowAllFoldersUnder(folder));
您似乎没有对在 ShowAllFoldersUnder
.
的递归调用中找到的文件夹执行任何操作
此修改应该可以解决它。变化:
ShowAllFoldersUnder(folder);
至:
folderList.AddRange(ShowAllFoldersUnder(folder));
在生产代码中,我可能会重构它以在整个递归过程中使用单个 List
,以避免创建和合并多个列表的任何开销。
将你的方法修改为这个
private static void ShowAllFoldersUnder(string path, List<string> folderList)
{
try
{
if ((File.GetAttributes(path) & FileAttributes.ReparsePoint)
!= FileAttributes.ReparsePoint)
{
foreach (string folder in Directory.GetDirectories(path))
{
folderList.Add(folder);
// Console.WriteLine(folder);
ShowAllFoldersUnder(folder, folderList);
}
}
}
catch (UnauthorizedAccessException) { }
}
现在这样称呼它
var _folders = new List<string>();
ShowAllFoldersUnder(Dir, _folders);
这样你就可以防止在其他答案中创建许多列表和消耗内存。通过使用这种方式,您可以向该方法提供一个初始列表,它将向其中添加所有条目,但其他答案每次都会生成一个列表,然后将结果复制到上层列表,这将导致大量内存分配,复制和释放。
现在,我知道 Whosebug 上已经有很多关于文件夹递归和获取文件夹(包括它的子目录等)的问题,pp.,但我没有找到与我在这里遇到的问题相关的任何问题.
我的问题如下:
我从 here(页面底部)获取了有关文件夹递归的代码片段,并根据我的需要对其进行了调整;也就是说,让它不将所有(子)目录写入控制台,而是将它们添加到列表中。这是我的代码(注意被注释掉的部分):
private static List<String> ShowAllFoldersUnder(string path)
{
var folderList = new List<String>();
try
{
if ((File.GetAttributes(path) & FileAttributes.ReparsePoint)
!= FileAttributes.ReparsePoint)
{
foreach (string folder in Directory.GetDirectories(path))
{
folderList.Add(folder);
// Console.WriteLine(folder);
ShowAllFoldersUnder(folder);
}
}
}
catch (UnauthorizedAccessException) { }
return folderList;
}
我是这样称呼它的(Dir
是一个包含路径的 string
):
var _folders = ShowAllFoldersUnder(Dir);
foreach (string folder in _folders)
{
Console.WriteLine(folder);
}
问题是只有第一级文件夹被添加到列表中,这意味着我的输出是例如:
[...]
C:\Users\Test\Pictures
C:\Users\Test\Recent
C:\Users\Test\Saved Games
C:\Users\Test\Searches
C:\Users\Test\SendTo
[...]
如果我从方法中取消注释 Console.WriteLine(folder);
,它会将所有(子)目录回显到控制台:
[...]
C:\Users\Test\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned
C:\Users\Test\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\ImplicitAppShortcuts
C:\Users\Test\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar
C:\Users\Test\AppData\Roaming\Microsoft\Internet Explorer\UserData
C:\Users\Test\AppData\Roaming\Microsoft\Internet Explorer\UserData\Low
C:\Users\Test\AppData\Roaming\Microsoft\MMC
C:\Users\Test\AppData\Roaming\Microsoft\Network
[...]
在花了数小时研究可能是我的错误之后,我感到很绝望。有没有人知道是什么导致了我的问题?
方法 ShowAllFoldersUnder
returns 一个字符串列表,但唯一一次真正用它做某事是在 'main' 方法中,您将它们写入Console
.
你需要改变
ShowAllFoldersUnder(folder);
到
folderList.AddRange(ShowAllFoldersUnder(folder));
您似乎没有对在 ShowAllFoldersUnder
.
此修改应该可以解决它。变化:
ShowAllFoldersUnder(folder);
至:
folderList.AddRange(ShowAllFoldersUnder(folder));
在生产代码中,我可能会重构它以在整个递归过程中使用单个 List
,以避免创建和合并多个列表的任何开销。
将你的方法修改为这个
private static void ShowAllFoldersUnder(string path, List<string> folderList)
{
try
{
if ((File.GetAttributes(path) & FileAttributes.ReparsePoint)
!= FileAttributes.ReparsePoint)
{
foreach (string folder in Directory.GetDirectories(path))
{
folderList.Add(folder);
// Console.WriteLine(folder);
ShowAllFoldersUnder(folder, folderList);
}
}
}
catch (UnauthorizedAccessException) { }
}
现在这样称呼它
var _folders = new List<string>();
ShowAllFoldersUnder(Dir, _folders);
这样你就可以防止在其他答案中创建许多列表和消耗内存。通过使用这种方式,您可以向该方法提供一个初始列表,它将向其中添加所有条目,但其他答案每次都会生成一个列表,然后将结果复制到上层列表,这将导致大量内存分配,复制和释放。