Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如果cmd.exe无法成功移动文件,是否会收到通知?_Delphi_Winapi_Delphi 10.3 Rio - Fatal编程技术网

Delphi 如果cmd.exe无法成功移动文件,是否会收到通知?

Delphi 如果cmd.exe无法成功移动文件,是否会收到通知?,delphi,winapi,delphi-10.3-rio,Delphi,Winapi,Delphi 10.3 Rio,我运行cmd.exe以移动具有管理员权限的文件: ThisParams := '/C move ' + '"' + ThisSourceFile + '"' + ' ' + '"' + ATargetFile + '"'; Winapi.ShellAPI.ShellExecute(0, 'runas', 'cmd.exe', PChar(ThisParams), '', Winapi.Windows.SW_HIDE); 不幸的是,ShellExecute总是返回成功,不管移动操作是否成功(移动

我运行cmd.exe以移动具有管理员权限的文件:

ThisParams := '/C move ' + '"' + ThisSourceFile + '"' + ' ' + '"' + ATargetFile + '"';
Winapi.ShellAPI.ShellExecute(0, 'runas', 'cmd.exe', PChar(ThisParams), '', Winapi.Windows.SW_HIDE);
不幸的是,
ShellExecute
总是返回成功,不管移动操作是否成功(移动操作将失败,例如,如果目标文件存在且为只读文件或目标磁盘受写保护)


因此,如果上述情况下的移动操作失败,我如何得到通知?

也许您可以使用管道和加载生成的文件 例如,移动A.txt B.txt>result.txt

procedure TForm1.Button1Click(Sender: TObject);
var
  stToDo: string;
  sl1 : TSTringList ;
  MyResult : boolean ;
begin
  stToDo := '/C move "C:\Users\awr\Desktop\D2\a.txt" "C:\Users\awr\Desktop\D2\b.txt" >C:\Users\awr\Desktop\D2\Result.txt';
  ShellExecute(Application.Handle, 'runas', 'cmd.exe' ,PChar(stToDo),'',  SW_HIDE);
  sl1 := TSTringList.create ;
  sl1.LoadFromFile('C:\Users\awr\Desktop\D2\Result.txt');
  MyResult := trim(sl1.text) <> '' ;
  sl1.Free ; 
procedure TForm1.按钮1点击(发送方:TObject);
变量
stToDo:字符串;
sl1:TSTringList;
MyResult:布尔型;
开始
stToDo:='/C move“C:\Users\awr\Desktop\D2\a.txt”“C:\Users\awr\Desktop\D2\b.txt”>C:\Users\awr\Desktop\D2\Result.txt';
ShellExecute(Application.Handle,'runas','cmd.exe',PChar(stToDo),'',SW_HIDE);
sl1:=TSTringList.create;
LoadFromFile('C:\Users\awr\Desktop\D2\Result.txt');
MyResult:=修剪(sl1.text)';
sl1.免费;

如果移动失败,“result.txt”为空

则不能移动
ShellExecute
启动命令解释器。显然,这一行动是成功的
ShellExecute
无法通知您代表其启动的操作的结果。您将不得不寻找另一种解决方案(比如编写自己的文件移动程序,然后启动该程序)。您应该停止尝试使用
cmd.exe
移动文件,并使用自己的代码执行此操作。我知道你想要提升,但你需要用另一种方式来解决这个问题。
runas
动词在这里不是正确的解决方案。我不能使用
try而不是
?如果
MOVE
失败,会发生什么样的错误?操作系统错误?Win32错误?
runas
动词用于提升。如果您不需要提升,只需调用
MoveFile
API函数即可执行移动。使用
CoGetObject
“提升:管理员!新建:{3ad05575-8857-4850-9277-11b85bdb8e09}”
进行提升
IFileOperation
-必要时显示uac promt。而不是使用
IFileOperation
如果此代码试图在写入文件之前加载该文件该怎么办?可能的其他解决方案:我可以简单地检查cmd执行后源文件是否仍然存在?使用WaitForSingleObject执行该操作使用
ShellExecute
不可能。您需要使用
ShellExecuteEx
并等待进程句柄。这些答案看起来都很糟糕@RbMm正确地指出了方向,我添加了一个链接到一个答案,给出了一个Delphi演示。