我已经在C#中编写了递归目录遍历方法(从asp.net页面托管)。代码按照我的意图工作(我枚举目标机器上的共享列表,然后递归共享并将每个文件/目录添加到TreeView中)。不幸的是,这消耗了大量的内存,并且需要很长时间才能运行,打开aspx页面会导致Webdev.Webserver内存使用率猛增到800兆,查看页面的Chrome实例消耗大量1.5GB内存! (针对本地工作站上托管的SMB共享运行测试代码)我甚至无法查看页面源,而无需挂镀铬。递归目录遍历/树占用大量内存
foreach (TreeNode n in FileSelectList.Nodes)
{
Dir_Node_Recurse(n, hostName);
//break;
}
取消注释// break;语句只会导致正在处理的第一个目录共享,而这会消耗更少的内存。 FileSelectList是一个Asp:TreeView。
public static void Dir_Node_Recurse(TreeNode node, string hostName)
{
DirectoryInfo dir = new DirectoryInfo(String.Format(@"\\{0}\{1}",
hostName,
node.ValuePath.ToString()
));
TreeNode tNode;
foreach (var i in dir.EnumerateDirectories())
{
tNode = new TreeNode(i.Name.ToString());
node.ChildNodes.Add(tNode);
Dir_Node_Recurse(tNode, hostName);
}
foreach (var i in dir.EnumerateFiles())
{
node.ChildNodes.Add(new TreeNode(i.Name.ToString()));
}
}
由于创建了大量的TreeNode对象,这似乎会导致极度的资源使用。我是否应该创建自己的节点类型以最大限度地减少内存使用量,或者是否有其他技术可以使其可用?
为什么你必须首先枚举所有的文件夹,而不是等待用户输入 - 如果用户可以选择是否钻入特定的文件夹,这不是一个好时机来看看@的内容文件夹? – 2011-05-19 22:10:10