FileExists 后 RenameFile 中的访问被拒绝
Access denied in RenameFile after FileExists
我定期将文件从路径导入到 Delphi 10.2 的应用程序中。每次成功导入后,我想将当前文件移动到新路径 (SuccessPath)。 SuccessPath 中可能已经存在文件名。这就是为什么我首先检查文件名是否存在。如果是这种情况,我会在文件名后附加一个索引(例如 test.txt 更改为 test_2.txt)。
在某些情况下 RenameFile returns false 和 GetLastError returns 拒绝访问。它可能是一个未关闭的文件句柄。调用 FileExists 后是否需要关闭句柄?我该怎么做?
这是我的示例代码:
procedure TDemo.Execute;
begin
MoveFileWithRenameDuplicates('C:\temp\test.txt', 'C:\temp\new\');
end;
procedure TDemo.MoveFileWithRenameDuplicates(oldFile, newPath: string);
var
lNewFile: string;
i: integer;
begin
lNewFile := newPath + TPath.GetFileName(oldFile);
i := 0;
repeat
if FileExists(lNewFile) then
begin
i := i + 1;
lNewFile := newPath + TPath.GetFileNameWithoutExtension(oldFile) + '_' + IntToStr(i) + TPath.GetExtension(oldFile);
end;
until not FileExists(lNewFile);
WriteLn('lNewFile=' + lNewFile);
if not RenameFile(oldFile, lNewFile) then
WriteLn(SysErrorMessage(GetLastError));
end;
我按照 Remy 的建议更改了循环。我还意识到附加索引实际上并没有增加,所以我也改变了它:
procedure TDemo.MoveFileWithRenameDuplicates(oldFile, newPath: string);
var
lNewFile: string;
i: integer;
begin
lNewFile := newPath + TPath.GetFileName(oldFile);
i := 0;
while not RenameFile(oldFile, lNewFile) do
begin
if FileExists(lNewFile) then
begin
lNewFile := newPath
+ TRegEx.Match(TPath.GetFileNameWithoutExtension(oldFile), '/^(?''name''[^_]*)_\d*$', [roIgnoreCase]).Groups['name'].Value
+ '_' + IntToStr(i) + TPath.GetExtension(oldFile);
end
else
begin
WriteLn(SysErrorMessage(GetLastError));
break;
end;
end;
end;
这似乎解决了我的问题。
我定期将文件从路径导入到 Delphi 10.2 的应用程序中。每次成功导入后,我想将当前文件移动到新路径 (SuccessPath)。 SuccessPath 中可能已经存在文件名。这就是为什么我首先检查文件名是否存在。如果是这种情况,我会在文件名后附加一个索引(例如 test.txt 更改为 test_2.txt)。
在某些情况下 RenameFile returns false 和 GetLastError returns 拒绝访问。它可能是一个未关闭的文件句柄。调用 FileExists 后是否需要关闭句柄?我该怎么做?
这是我的示例代码:
procedure TDemo.Execute;
begin
MoveFileWithRenameDuplicates('C:\temp\test.txt', 'C:\temp\new\');
end;
procedure TDemo.MoveFileWithRenameDuplicates(oldFile, newPath: string);
var
lNewFile: string;
i: integer;
begin
lNewFile := newPath + TPath.GetFileName(oldFile);
i := 0;
repeat
if FileExists(lNewFile) then
begin
i := i + 1;
lNewFile := newPath + TPath.GetFileNameWithoutExtension(oldFile) + '_' + IntToStr(i) + TPath.GetExtension(oldFile);
end;
until not FileExists(lNewFile);
WriteLn('lNewFile=' + lNewFile);
if not RenameFile(oldFile, lNewFile) then
WriteLn(SysErrorMessage(GetLastError));
end;
我按照 Remy 的建议更改了循环。我还意识到附加索引实际上并没有增加,所以我也改变了它:
procedure TDemo.MoveFileWithRenameDuplicates(oldFile, newPath: string);
var
lNewFile: string;
i: integer;
begin
lNewFile := newPath + TPath.GetFileName(oldFile);
i := 0;
while not RenameFile(oldFile, lNewFile) do
begin
if FileExists(lNewFile) then
begin
lNewFile := newPath
+ TRegEx.Match(TPath.GetFileNameWithoutExtension(oldFile), '/^(?''name''[^_]*)_\d*$', [roIgnoreCase]).Groups['name'].Value
+ '_' + IntToStr(i) + TPath.GetExtension(oldFile);
end
else
begin
WriteLn(SysErrorMessage(GetLastError));
break;
end;
end;
end;
这似乎解决了我的问题。