如何防止使用 GetTempFileName 创建的文件在重启时被自动删除
How to Prevent Files Created with GetTempFileName Being Automatically Deleted upon Reboot
我们的应用程序从外部设备收集数据。此数据主要驻留在内存中,但在用户明确保存数据之前会以临时文件的形式假脱机到磁盘。这是为了在应用程序由于某种原因崩溃时提供一些恢复机会。总体来说还是可以的。
最近我们发现,由于 Windows 对自动更新越来越严格,这些文件会在重新启动时自动删除。因此,如果 Windows 终止我们的应用程序以自动应用更新,则允许恢复的临时文件在重启后会消失。
我通过故意终止应用程序并重新启动来测试这个问题;的确,临时文件在重启后就消失了。
这些文件是使用 Win32 API 调用 GetTempFileName
以及 GetTempPath
创建的。我读过的关于这个主题的所有内容都说这些文件 不会 自动删除,但它们显然正在被删除。
我该怎么做才能阻止这种情况?或者我应该只更改存储安全数据的位置?
您看到的是 Windows 10 中新增的 "Storage Sense" 功能。
How to Clear Temporary Files Automatically in Windows 10.
Windows 10 got the ability to clear temporary files automatically in a recent build. Starting with build 15014, a new option appeared in Settings.
启用后,可以设置为清除临时文件、回收站等项目。您可以单独关闭它们。
或者,另一种选择是更改您的应用以将其临时文件保存在您控制的非系统临时文件夹中,而不是使用 GetTempPath()
。也许还可以使用 GetTempFileName()
以外的其他名称来创建您的临时文件名(例如使用 date/times 或 guid),因此 Windows 不可能跟踪您创建的临时文件。那么也许你的文件就不会再被存储感知自动删除了。
IMO 的最佳解决方案是不使用临时文件夹,其中包含(顾名思义)可以删除而不会产生任何后果的临时文件。
相反,您应该将它们存储在 LocalAppdata 文件夹中的某个位置。
使用 SHGetFolderPath 函数检索 LocalAppData 文件夹的实际位置。
在 LocalAppData 中创建一个文件夹,其名称是您公司的名称 and/or 产品名称或两者的某种组合,并将所有伪临时文件存储在那里。
我们的应用程序从外部设备收集数据。此数据主要驻留在内存中,但在用户明确保存数据之前会以临时文件的形式假脱机到磁盘。这是为了在应用程序由于某种原因崩溃时提供一些恢复机会。总体来说还是可以的。
最近我们发现,由于 Windows 对自动更新越来越严格,这些文件会在重新启动时自动删除。因此,如果 Windows 终止我们的应用程序以自动应用更新,则允许恢复的临时文件在重启后会消失。
我通过故意终止应用程序并重新启动来测试这个问题;的确,临时文件在重启后就消失了。
这些文件是使用 Win32 API 调用 GetTempFileName
以及 GetTempPath
创建的。我读过的关于这个主题的所有内容都说这些文件 不会 自动删除,但它们显然正在被删除。
我该怎么做才能阻止这种情况?或者我应该只更改存储安全数据的位置?
您看到的是 Windows 10 中新增的 "Storage Sense" 功能。
How to Clear Temporary Files Automatically in Windows 10.
Windows 10 got the ability to clear temporary files automatically in a recent build. Starting with build 15014, a new option appeared in Settings.
启用后,可以设置为清除临时文件、回收站等项目。您可以单独关闭它们。
或者,另一种选择是更改您的应用以将其临时文件保存在您控制的非系统临时文件夹中,而不是使用 GetTempPath()
。也许还可以使用 GetTempFileName()
以外的其他名称来创建您的临时文件名(例如使用 date/times 或 guid),因此 Windows 不可能跟踪您创建的临时文件。那么也许你的文件就不会再被存储感知自动删除了。
IMO 的最佳解决方案是不使用临时文件夹,其中包含(顾名思义)可以删除而不会产生任何后果的临时文件。
相反,您应该将它们存储在 LocalAppdata 文件夹中的某个位置。
使用 SHGetFolderPath 函数检索 LocalAppData 文件夹的实际位置。
在 LocalAppData 中创建一个文件夹,其名称是您公司的名称 and/or 产品名称或两者的某种组合,并将所有伪临时文件存储在那里。