1

我编写了一个程序来创建几个 sqlite3 数据库临时文件。在开发中,我只是将它们存储在与 src 包相同的文件夹中的文件夹中。我忽略了这样一个事实,即在从 Program Files 编译和运行代码时需要管理员访问权限。(我知道 Program Files 中的临时文件也是不好的做法)

问题是:没有问题。我没有收到IOError: [Errno 13] Permission denied:任何形式的警告。此外,如果我转到应该有临时文件的文件夹,则没有。

如果我添加一行

print os.path.exists(r'C:\Program Files (x86)\ProgramName\temp\filename.db')

或者

print os.listdir(r'C:\Program Files (x86)\ProgramName\temp')

对于我的程序,它显示文件在那里,但在资源管理器、cmd 或空闲中不存在。但是,它们确实出现在 cygwin 中。

我已经显示了隐藏的文件/文件夹,但它们没有出现。

如果我使用资源管理器复制临时文件夹,则文件不会一起标记。如果我使用 cygwin 复制文件夹,他们会这样做。它们也对资源管理器可见。

有没有其他人经历过这种情况或知道发生了什么?

4

1 回答 1

3

你是对的,你不应该写入你的 Program Files 目录。实际上,这就是您的程序的解决方案:更改您的脚本以停止这样做。

但是,如果您想知道文件的去向,当您尝试写入 Program Files 时(在 Vista 或更高版本上,未禁用 UAC):

  • 如果您以管理员身份运行,而不是使用 XP/2003 或更早的仿真,则文件将直接写入指定的路径。
  • 如果您的应用程序适合魔术触发器,看起来像一个安装程序(请参阅此处查看 Vista 文档),则文件将直接写入指定的路径。
  • 如果您的应用程序位于 Microsoft 的兼容性数据库中,则路径将通过兼容性数据库中的整体进行映射(似乎在任何地方都没有记录)。
  • 否则,您的路径将通过 UAC 文件虚拟化传递,这意味着尝试写入受保护的目录,例如Program Files最终位于用户应用程序数据目录下的某个位置——对于您的程序,它看起来像 Program Files,但对于例如 Explorer 或 cmd.exe它没有。

我相信该位置没有得到保证也没有记录,并且有一次它从用户的应用程序数据目录移动到用户的不同特殊应用程序数据目录下的每个应用程序目录,但至少在一台 Windows 7 机器上是这样的:

C:\Users\horriblyUnpythonic\AppData\Local\VirtualStore\Program Files (x86)\ProgramName\temp\filename.db


如果您搜索“UAC 文件虚拟化”,就会有很多博客文章。它们中的大多数都是从构建自定义安装程序的角度编写的,比如这个(因为你可以想象,这对于自定义安装程序来说是一个严重的问题),但它们大多都能理解这些想法,并提供很多详细信息,并添加链接以供进一步阅读。

如果您只是在从 Vista 迁移到 7 或从 32 位 Vista 迁移到 64 位 Vista 时遇到了这个问题,那么这个 Microsoft 博客是我见过的唯一一个深入细节的地方……除了图像和大部分讨论似乎在某个时候消失了。

于 2013-12-21T00:23:11.040 回答