delphi - 在 TTimer 事件中重命名文件会产生错误
问题描述
请参阅下面的步骤如何重现。我使用 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,结果相同:
解决方案
我遇到了同样的问题,
首先:它似乎与您的代码无关。
据我所知,错误是 Windows 错误并发生,当您尝试在第一个重命名过程(窗体 Windows)正确完成之前再次重命名文件时,delphi 重命名过程可能已经完成并且您的代码继续(并开始另一个重命名)但 Windows 重命名尚未正确完成。
当您使用不同的编程语言(例如批处理文件)时,也会发生同样的问题:
:loop
ren named.txt renamed.txt
goto loop
您会收到相同的错误消息。
要解决您的问题,我唯一能想到的就是像您在帖子中建议的那样增加计时器延迟。
我希望,这是任何帮助,我很抱歉我无法解决您的问题
推荐阅读
- swift - 将字符串类型转换为电话号码
- java - 空对象引用上的“android.os.Looper.quit()” - Android O
- javascript - 我无法在我的 Laravel 项目中管理我的布局
- kubernetes - [ERROR KubeletVersion]:kubelet 版本高于控制平面版本
- inno-setup - 在 Inno Setup 中更改任务列表框和其他控件的背景颜色
- android - Android:JSONDownloader 返回空字符串
- ios - 更改在 TestFlight 上使用但不是 App Store 的应用程序的捆绑包 ID
- javascript - 在数组对象内过滤数组后返回值
- ios - Xcode 10 自动完成功能在其他 swift 文件中不起作用
- zend-framework - Swoole http 服务器中的 Zend View 行为