当前位置 : 主页 > 编程语言 > delphi >

delphi – 有没有办法直接运行“dir”?

来源:互联网 收集:自由互联 发布时间:2021-06-23
在 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, 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:\'));
网友评论