【问题标题】:Getting safe temp folder in Windows在 Windows 中获取安全的临时文件夹
【发布时间】:2011-04-04 12:55:54
【问题描述】:

我需要一个安全的临时文件夹,我可以在其中存储我的应用程序的临时文件,但到目前为止,我的研究使我得出结论,我发现的所有方法都有缺陷。

第一个想法是使用GetTempPath函数,但这会导致两个问题:

  • 该文件夹可能不存在,因此我必须将文件夹逐个截断到根目录,如果它们不存在则重新创建它们回到完整路径(容易出错,乏味)
  • 从“Larry Osterman 的 WebLog”click 看来,GetTempPath 可能会回退到 USERPROFILE 或 Windows 目录并在其中提取大量文件,这太糟糕了(TM)!

在同一篇文章中,有人建议使用 GetEnvironmentVariable,但这对我来说似乎是一个危险的功能(例如缺少 TMP 和 TEMP 环境变量)。

我可以使用更清洁的功能吗?似乎 SHGetKnownFolderPath 不知道临时文件夹是什么。

【问题讨论】:

  • Directory.Create 创建途中所有不存在的目录,如果目录存在则不执行任何操作。

标签: windows api filesystems temporary-files


【解决方案1】:

您的程序可能不是唯一依赖GetTempPath 的程序,因此期望它返回正确的可写路径是合理的。特别是因为 Windows 会自动为您初始化 TMP 和 TEMP 环境变量;有人将不得不费力地重写它们,他们有责任确保更改不会弄乱他们的系统。

我会继续假设 GetTempPath 工作正常,并担心在您尝试创建临时文件时会失败 - 那时可能会出现其他错误,无论如何您都需要检查。

【讨论】:

  • 我决定使用 GetEnvVar,如文章中所述。这避免了较长用户名的问题,应该足够了。如果没有 TMP 或 TEMP 变量,我认为假设系统几乎无法使用就足够了。
  • -1 正如文档中特别指出的那样 "请注意,函数 不会验证路径是否存在,也不会测试当前进程是否具有任何类型的访问权限 到路径”.
  • @David,它当然不能保证,这不是它的工作。检查文件夹需要大量额外的工作,这在正确配置的系统上是不必要的。我支持我的答案。
【解决方案2】:

一个想法是获取您的应用程序所在的路径(GetModuleFileNameEx 结合GetModuleHandle(NULL)GetCurrentProcess),因为只要您的应用程序在其中运行,就无法在 Windows 下删除该目录(也许我'我错了......几年前我不能这样做:))并在这个目录中创建一个临时目录。

【讨论】:

  • 一般用户不能写入程序文件夹。没有骰子。
【解决方案3】:

您的第一个要点是解决方案。将其包装在一个方法中,这样您就不会重复代码。

【讨论】:

    【解决方案4】:

    根据this answer,Boost 的 Filesystem 库可以用于此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 2013-08-27
      相关资源
      最近更新 更多