使用Shell(DIR)进行快速目录列表

时间:2017-09-18 10:56:43

标签: c# directory createprocess processstartinfo

我正在做一些工作来优化在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();

1 个答案:

答案 0 :(得分:0)

  

DIR不是exe

cmd.exe是一个exe。

使用2个参数调用cmd.exe

  • /C
  • dir

注意:您也可以将UseShellExecute设置为true。