CnCommon单元之MoveFile、DeleteToRecycleBin【3】

今天要学习的是MoveFile函数,作用就是移动文件或者文件夹。其实在系统kernel32.dll的API中已经提供该函数。

不过本着学习的精神还是分析下被重新打包的MoveFile函数

// 移动文件、目录
function MoveFile(const sName, dName: string): Boolean;
var
  s1, s2: string;
  lpFileOp: TSHFileOpStruct;
begin
  s1 := PChar(sName) + #0#0;
  s2 := PChar(dName) + #0#0;
  with lpFileOp do
  begin
    Wnd := Application.Handle;
    wFunc := FO_MOVE;
    pFrom := PChar(s1);
    pTo := PChar(s2);
    fFlags := FOF_ALLOWUNDO;
    hNameMappings := nil;
    lpszProgressTitle := nil;
    fAnyOperationsAborted := True;
  end;

  try
    Result := SHFileOperation(lpFileOp) = 0;
  except
    Result := False;
  end;
end;

其中结构体TSHFileOpStruct需要引用ShellAPI单元。

知识点1:由于使用到了字符指针,为了确保不出错,在字符串的末尾加上了#0#0结束符。

知识点2:对结构体批量填充数据可以使用 with do 语句.不用也可以,但是需要都加上结构体前缀,麻烦不说还没有可读性.学到了.

 

还有一个删除文件到回收站DeleteToRecycleBin函数也顺便学习下,和上面的MoveFile函数非常类似.

// 删除文件到回收站
function DeleteToRecycleBin(const FileName: string): Boolean;
var
  s: string;
  lpFileOp: TSHFileOpStruct;
begin
  s := PChar(FileName) + #0#0;
  with lpFileOp do
  begin
    Wnd := Application.Handle;
    wFunc := FO_DELETE;
    pFrom := PChar(s);
    pTo := nil;
    fFlags := FOF_ALLOWUNDO or FOF_SILENT or FOF_NOCONFIRMATION;
    hNameMappings := nil;
    lpszProgressTitle := nil;
    fAnyOperationsAborted := True;
  end;

  try
    Result := SHFileOperation(lpFileOp) = 0;
  except
    Result := False;
  end;
end;

 

posted on 2021-05-01 22:30  YXGust  阅读(147)  评论(0)    收藏  举报

导航