我正在做一些工作来优化在C#,文件和文件夹中的网络驱动器上列出文件夹的内容。对于文件,我需要FileName,File Size和DateModified,对于文件夹只有Name和DateModified。
我在StackOverflow上搜索了各种解决方案并决定使用Directory.GetFiles,使用EnumerateFiles没有任何好处,因为我没有并行处理文件。
我在WAN上使用4000和5个子文件夹的测试用例GetFiles仍然需要30秒或更长时间,但Windows可以在2秒内对文件夹进行DIR。
我不想进入太多的Windows API代码,所以我认为一个好的中间地点是Shell出DIR命令,重定向标准输出并解析输入。不漂亮,但应该没问题。我发现这个代码完全符合我的要求:
Process process = new Process();
process.StartInfo.FileName = "ipconfig.exe";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
// Synchronously read the standard output of the spawned process.
StreamReader reader = process.StandardOutput;
string output = reader.ReadToEnd();
这适用于ipconfig.exe,但DIR不是exe,所以任何想法我怎么称呼它?我想重定向这样的事情:
DIR“\ MyNasDrive \ MyFolder”
最糟糕的情况是我可以将它包装在.bat文件中,但这感觉非常糟糕。
任何想法都赞赏。
==找到我自己的解决方案,但是如果你发现它有任何问题请告诉我==
string DirPath = "\\\\MYServer\\MyShare\\";
Process process = new Process();
process.StartInfo.FileName = "C:\\Windows\\System32\\cmd.exe";
process.StartInfo.Arguments = "/C DIR /-C \"" + DirPath + "\"";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.StartInfo.CreateNoWindow = true;
process.Start();
// Synchronously read the standard output of the spawned process. Note we aren't reading the standard err, as reading both
// Syncronously can cause deadlocks. https://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutput(v=vs.110).aspx
//if we need to do this in the future then might be able to use https://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputreadline(v=vs.110).aspx
StreamReader reader = process.StandardOutput;
string output = reader.ReadToEnd();
process.WaitForExit();
process.Close();
答案 0 :(得分:0)
DIR不是exe
cmd.exe
是一个exe。
使用2个参数调用cmd.exe
:
/C
dir
注意:您也可以将UseShellExecute设置为true。