• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

CnCommon单元之MoveFile、DeleteToRecycleBin【3】

开发技术 开发技术 2周前 (05-01) 5次浏览

今天要学习的是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;

 


程序员灯塔
转载请注明原文链接:CnCommon单元之MoveFile、DeleteToRecycleBin【3】
喜欢 (0)