【发布时间】:2018-10-07 09:58:38
【问题描述】:
我有以下代码,每两次执行一次 全天分钟数:
int sucessfully_deleted = DeleteFile(dest_filename);
if (!sucessfully_deleted)
{
// this never happens
}
rename(source_filename,dest_filename);
每隔几个小时 rename() 就会失败,并显示 errno=13 (EACCES)。涉及的文件都位于 DropBox 目录中,我有预感 DropBox 可能是原因。我认为 DeleteFile() 函数可能会返回非零的successful_deleted,但实际上 DropBox 仍可能忙于做一些与删除相关的事情,从而阻止 rename() 成功。我接下来所做的是将 rename() 更改为 my_rename() ,这将尝试 rename() 并且在任何失败时将 Sleep() 等待一秒钟并尝试第二次。果然,从那以后它一直运行良好。更重要的是,我每隔几个小时就会收到一条显示首次尝试失败的诊断消息。第二次尝试从未失败。
所以你可以说问题已经完全解决了……但我想了解可能发生的情况,以便更好地保护自己免受未来任何相关的 DropBox 问题的影响……
我真的很想有一个新的 super_delete() 函数,直到文件被正确删除并在所有方面完成后才会返回。
【问题讨论】:
-
你知道 13 是
EACCESaka "Permission denied"吗? -
在什么操作系统上运行?
-
@MichaelVeksler:来自“
DeleteFile()”我断定它是 Windows。 -
已编辑问题以回答 cmets。
-
对我来说,这看起来好像
DeleteFile()函数没有“原子地”删除,但不知何故,删除请求会排队。所以你重试的方法是有道理的。另一方面,由于我们不知道“排队”可能需要多长时间......
标签: c++ c visual-studio windows-10 dropbox