gpt4 book ai didi

delphi - 有没有办法直接运行 "dir"?

转载 作者:行者123 更新时间:2023-12-03 15:37:10 24 4
gpt4 key购买 nike

my answer to this question ,当提问者需要一种快速的方法来获取网络驱动器上文件夹的目录列表时,我建议使用 DOS“dir”命令。不幸的是,它是一个命令,而不是一个程序,所以你不能用 CreateProcess 执行它,所以我不得不把它放在一个批处理文件中。我真的不喜欢这个解决方案。对我来说这感觉就像是黑客。有谁知道如何从 Delphi 而不是从外部批处理文件运行 dir ?

最佳答案

隐形解决方案(创建管道,执行命令,将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, nil, true,
CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or
NORMAL_PRIORITY_CLASS, nil, nil, 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:\'));

关于delphi - 有没有办法直接运行 "dir"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2500374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com