Delphi 如果cmd.exe无法成功移动文件,是否会收到通知?
我运行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总是返回成功,不管移动操作是否成功(移动
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演示。