【发布时间】:2019-12-18 22:18:00
【问题描述】:
请参阅以下如何重现的步骤。我使用 Delphi 10.1 Berlin 和 Windows 10 并编译为 win32。
- 创建新的 VCL 表单应用程序
- 在表单上放置一个 TTimer 和一个 TMemo
- 将计时器的间隔设置为 10 毫秒
- 将此代码放入 OnTimer 事件中:
if FileExists('named.txt') then
begin
Memo1.Lines.Add('named.txt exists');
DeleteFile('renamed.txt'); //delete if it exists
if RenameFile('named.txt', 'renamed.txt') then
Memo1.Lines.Add(' renamed OK')
else
Memo1.Lines.Add(' rename failed with error : '+ IntToStr(GetLastError));
end;
运行程序
创建一个名为.txt的文件
TMemo 输出显示:
named.txt 存在 改名OK- 现在在资源管理器中将文件renamed.txt 重命名为named.txt。
TMemo 输出现在显示:
named.txt 存在 改名OK named.txt 存在 改名OK但是会出现一条错误消息,显示“文件或文件夹不存在”。为什么?
(重命名文件返回 OK)。
将计时器的间隔设置为例如 500 毫秒似乎没问题(没有错误消息)。
这是消息(瑞典语):
我什至将 exe 文件复制到另一台 PC,结果相同:
【问题讨论】:
-
用另一组文件名试一试——但只在这个小测试程序中——看看你是否能重现问题。如果您与另一个进程处于竞争状态,那么使用其他文件名将消除来自该其他进程的交互,并且您可以查看问题是否可重现......您的测试中可能已经有不同的文件名(从使用的名称来看,它可能看起来如此)。您是否尝试过使用此 exact 代码?
-
@RemyLebeau 我建议不要在打开包含要处理的数据的现有文件时使用
FILE_FLAG_DELETE_ON_CLOSE标志。为什么?使用此类标志意味着文件将在其所有句柄关闭后立即被删除。因此,如果由于某种原因,您的应用程序崩溃并且一旦关闭,您的应用程序将无法正确处理数据,则该文件的打开文件句柄将被关闭并删除文件,从而删除所有数据。应用程序应仅在正确处理此类文件时才关闭此类文件,而不是在此之前... -
... 在处理由应用程序创建的临时文件时,使用
FILE_FLAG_DELETE_ON_CLOSE更为常见,因为它确保即使应用程序崩溃,它们也会被删除,因此即使是不稳定的应用程序不会通过创建和从不删除一堆临时文件来慢慢消耗整个驱动器空间。 -
@HeartWare:感谢所有 cmets 和帮助。我更改了名称,但得到了同样的错误。我什至将 exe 文件复制到另一台 PC(到 c:\test)并得到相同的错误:“文件或文件夹不存在”。
-
@Thomas 病毒扫描程序锁定文件怎么样(当两台 PC 具有相同...)