在某些情况下,在程序结束时留下一个临时文件夹进行进一步检查是很有用的。我尝试在程序开头使用filesystem::remove_all()
删除旧数据,然后立即创建文件夹。这是说明事情的最小程序。
#include <experimental\filesystem>
namespace fs = std::experimental::filesystem;
int main() {
fs::remove_all("temp.dir");
fs::create_directory("temp.dir");
}
它可能运行良好,但是,例如,如果您使用Visual Studio 2017在Windows上进行编译,如果您在资源管理器中打开了临时文件夹,则删除有效,但创建失败(抛出异常)。
在Windows下,这主要是因为删除调用了Posix函数rmdir()
,这似乎在有效删除目录之前返回。后来对CreateDirectory()
的调用失败了ERROR_ACCESS_DENIED
,进一步执行不再发生。
我用一个非常难看的延迟或一个检查文件夹存在的循环来解决这个问题。在任何情况下都是一个非常糟糕的黑客。
现在问题:这是一个仅限于Windows的问题吗?这是一个实现错误吗?您知道任何更好的便携式解决方案吗?