将文件存储在TEMP目录中是否足够安全?
Is it safe enough to store a file in the TEMP directory
通过GetTempPath
, GetTempPath
和CreateFile
在%TEMP%目录中存储文件超过两个小时是否足够安全?你能保证这个文件不会被提前删除吗?
在TEMP目录中创建的文件必须使用CreateFile的FILE_FLAG_DELETE_ON_CLOSE
选项创建。这确保了文件将始终被清理,并且您不能喷射垃圾文件,即使您的程序在有机会再次删除文件之前崩溃。
这个选项也不可避免地迫使你做正确的事情,在你使用它的时候保持文件打开。这反过来又阻止了任何人删除文件,即使他们使用大锤。
许多程序不遵循这个建议,用户的TEMP目录往往是一个大旧的混乱,迫使用户偶尔手动清理它。作为Windows的内置功能,他将使用"磁盘清理"小程序。这种情况下,如果您不遵循此建议,您将丢失文件。最好使用%AppData%。
没有保证。这个文件夹通常不会被清除,除非用户开始清理。
但是每个人都可以在这里删除文件。在常规的基础上这样做是明智的
为了防止文件被删除,您可以保持一个句柄打开(假设应用程序一直在运行),并且让不指定FILE_SHARE_DELETE
(如果适用,也不指定FILE_SHARE_WRITE
)。
使用%APPDATA%或%PROGRAMDATA%中您自己定期清除的路径,或者让用户指定路径。
此外,您可以注册一个定期清理文件夹的计划任务。
如果您不希望其他进程可以删除您的文件,只需将它们以FILE_SHARE_READ | FILE_SHARE_WRITE
的共享模式打开即可。这样,任何试图删除它们的尝试都将失败,但任何其他进程都可以读取或写入它们。
BTW:这与%TEMP%文件夹中的文件无关。
如果你不能有一个进程来保持它们一直打开,你必须依赖系统上的其他进程(和其他用户)不做任何事情…
- 通过网络、跨平台传递std::变体是否安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 在函数结束后使用指向变量的指针是否安全?
- 逐字节删除 void* 是否安全?
- 在 RAII 构造中修改 RVO 值是否安全?
- 线程调用的函数对对象删除是否安全?
- 将对象的字节复制到数组并再次复制回来是否安全
- 使用枚举为数组编制索引是否安全?
- 返回从字符串文本创建的静态string_view是否安全?
- 在cstlib中将#include_next替换为#include是否安全
- 由并发无序映射查找线程调用的函数是否安全?
- 使用 c++ 原子时编写"y=++x"是否安全?
- 从另一个线程发出信号是否安全?
- 从其存储的回调中删除 std::函数是否安全
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- 当我在C++中调用 struce 的只读静态成员时,线程是否安全
- 同时调用 ASIO 对象的 API 是否安全?
- 使用自己的迭代器分配容器是否安全?