C# DirectoryInfo GetFiles函数调用之后内存居高不下
用C#ConsoleApplication写了个函数就只有下面两行代码文件和目录总数比较大25万件左右执行完之后内存一直居高不下。就高手解答。在线等。。。Director...
用C# ConsoleApplication写了个函数就只有下面两行代码 文件和目录总数比较大25万件左右
执行完之后内存一直居高不下。就高手解答。在线等。。。
DirectoryInfo currentFolder = new DirectoryInfo("E:\\File(25万)");
FileInfo[] lstFolderFiles = currentFolder.GetFiles("*.xml", SearchOption.AllDirectories); 展开
执行完之后内存一直居高不下。就高手解答。在线等。。。
DirectoryInfo currentFolder = new DirectoryInfo("E:\\File(25万)");
FileInfo[] lstFolderFiles = currentFolder.GetFiles("*.xml", SearchOption.AllDirectories); 展开
3个回答
展开全部
DirectoryInfo currentFolder = new DirectoryInfo("E:\\File(25万)");
FileInfo[] lstFolderFiles = currentFolder.GetFiles("*.xml", SearchOption.AllDirectories);
....
您是想搜索所有XML啊....
那就最好别全用C#的封装代码
如果要用.....
使用CMD命令加/P制作
过程很复杂..要听么?
好吧我还是给你说吧
25W
很大的数字哦
CMD 的DIR命令允许/P作为一屏显示,调用CMD并且获取其具体内容进行字符串解析即可..
private void ExecuteCmd(string command)
{
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.CreateNoWindow = true;
p.Start();
p.StandardInput.WriteLine("DIR /P");
p.StandardInput.WriteLine("exit");
p.WaitForExit();//这里是关闭,记得删掉,不然你就只能获取第一屏了
this.textBox1.Text=textBox1.Text+ p.StandardOutput.ReadToEnd();
p.Close();//这个也不要撒.....
}
这是一个最基本的...
然后p.StandardOutput.ReadToEnd();
这个就是读出来的内容
你解析后.
给CMD输入ENTER.然后再获取.做一个循环即可
你试试吧
手敲的代码.不知道好不好用..保重..学长只能帮你到这里了...
FileInfo[] lstFolderFiles = currentFolder.GetFiles("*.xml", SearchOption.AllDirectories);
....
您是想搜索所有XML啊....
那就最好别全用C#的封装代码
如果要用.....
使用CMD命令加/P制作
过程很复杂..要听么?
好吧我还是给你说吧
25W
很大的数字哦
CMD 的DIR命令允许/P作为一屏显示,调用CMD并且获取其具体内容进行字符串解析即可..
private void ExecuteCmd(string command)
{
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.CreateNoWindow = true;
p.Start();
p.StandardInput.WriteLine("DIR /P");
p.StandardInput.WriteLine("exit");
p.WaitForExit();//这里是关闭,记得删掉,不然你就只能获取第一屏了
this.textBox1.Text=textBox1.Text+ p.StandardOutput.ReadToEnd();
p.Close();//这个也不要撒.....
}
这是一个最基本的...
然后p.StandardOutput.ReadToEnd();
这个就是读出来的内容
你解析后.
给CMD输入ENTER.然后再获取.做一个循环即可
你试试吧
手敲的代码.不知道好不好用..保重..学长只能帮你到这里了...
展开全部
GetFiles就是获得目录下[默然不包括子文件夹中的]的文件,你加了SearchOption.AllDirectories
就搜索包括子文件夹中的,文件并不会读取到内存中,但是:
因为你的文件和目录很多,这样一次搜索会消耗大量的CPU和一些内存
FileInfo[]中的每一个元素都是一个FileInfo类的实例,那么实际就是new出来的,而new就是开创建对象分配空间,也就是每找到一个*.xml文件就会在内存中开辟空间,这会消耗大量的内存空间
更多追问追答
追问
理论上讲C#的GC不是应该自动回收资源的吗?
事实上我加了下面2句代码也是没有释放啊
currentFolder = null;
lstFolderFiles = null;
追答
GC会自动回收资源,但是具体什么时候回收程序员是不能决定的,也就是说你设置lstFolderFile=null只是标记lstFolderFiles 已经可以被回收了,但是到底什么时候回收你是无法确定的。你说的GC.Collect;实际也只是给GC一个提示,告诉GC可以做资源回收了,到底做了没有不知道
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
当然居高不下了额。。。。全部读取读取到内存中了=。= 能下来才怪呢!
更多追问追答
追问
理论上讲C#的GC不是应该自动回收资源的吗?
事实上我加了下面2句代码也是没有释放啊
currentFolder = null;
lstFolderFiles = null;
而且手动去让GC回收貌似也是不行
GC.Collect;
GC.WaitForPendingFinalizers();
追答
这个只是代表手动强制收回吧,但是并没有明确回收时间
Dispose() clear() 这些命令可以么?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询