delphi – 有没有办法直接运行“dir”?
发布时间:2020-12-15 09:11:02 所属栏目:大数据 来源:网络整理
导读:在 my answer to this question,提问者需要快速获取网络驱动器上文件夹的目录列表,我建议使用DOS“dir”命令.不幸的是,它是一个命令,而不是一个程序,所以你不能用CreateProcess执行它,所以我不得不把它放在一个批处理文件中.我真的不喜欢那个解决方案.这对我
在
my answer to this question,提问者需要快速获取网络驱动器上文件夹的目录列表,我建议使用DOS“dir”命令.不幸的是,它是一个命令,而不是一个程序,所以你不能用CreateProcess执行它,所以我不得不把它放在一个批处理文件中.我真的不喜欢那个解决方案.这对我来说感觉像是一个黑客.有没有人知道从Delphi而不是从外部批处理文件运行dir的方法?
解决方法
Invisible Solution(创建管道,执行命令,将stdout重定向到管道,读出管道):
function Console(const Command: String): String; var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; SecurityAttr: TSecurityAttributes; OutputPipeRead,OutputPipeWrite: THandle; Res: Boolean; BufSize: Cardinal; Buffer: String; BytesRead: Cardinal; begin FillChar(ProcessInfo,SizeOf(TProcessInformation),0); FillChar(SecurityAttr,SizeOf(TSecurityAttributes),0); SecurityAttr.nLength := SizeOf(SecurityAttr); SecurityAttr.bInheritHandle := true; SecurityAttr.lpSecurityDescriptor := nil; CreatePipe(OutputPipeRead,OutputPipeWrite,@SecurityAttr,0); FillChar(StartupInfo,SizeOf(TStartupInfo),0); StartupInfo.cb:=SizeOf(StartupInfo); StartupInfo.hStdInput := 0; StartupInfo.hStdOutput := OutputPipeWrite; StartupInfo.hStdError := OutputPipeWrite; StartupInfo.wShowWindow := SW_HIDE; StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; Res := CreateProcess(nil,PChar(command),nil,true,CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,StartupInfo,ProcessInfo); CloseHandle(OutputPipeWrite); Result := ''; if Res then begin SetLength(Buffer,5000); BufSize := Length(Buffer); repeat Res := ReadFile(OutputPipeRead,Buffer[1],BufSize,BytesRead,nil); Result := Result + Copy(Buffer,1,BytesRead); until not Res; WaitForSingleObject(ProcessInfo.hProcess,INFINITE); CloseHandle(ProcessInfo.hProcess); end; CloseHandle(OutputPipeRead); end; 样品用法: ShowMessage(Console('cmd /c dir C:')); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |