【问题标题】:Compiled Python writing to Program Files编译 Python 写入程序文件
【发布时间】:2013-12-20 23:47:31
【问题描述】:

我编写了一个程序来创建几个 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 复制文件夹,他们会这样做。它们也会对资源管理器可见。

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

【问题讨论】:

  • C:\Program Files (x86)\ProgramName\temp\filename.db 是一个有效的 Linux 文件名。我不记得 Windows 是否真的可以“看到”这些文件,但你能确认不只是一个名为 C:\Program Files (x86)\ProgramName\temp\filename.db 的本地文件吗?
  • IIRC,Windows 实际上将您的文件放在我不记得的其他地方,如果程序尝试写入 Program Files 中的安装目录,则假装它们将进入 Program Files 中。我曾经遇到过类似的问题。不幸的是,这与我的知识范围有关。
  • 你用来创建文件的代码是什么?
  • @user2357112 谜团解开了,谢谢。我有一种感觉,windows 在幕后做了一些像这样的黑魔法,尽管 cygwin 看穿它对我来说仍然很奇怪。

标签: python windows file-io cygwin program-files


【解决方案1】:

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

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

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

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

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


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

如果您只是在从 Vista 迁移到 7 或从 32 位 Vista 迁移到 64 位 Vista 时遇到此问题,this Microsoft blog 是我见过的唯一一个细节如此深入的地方……除了图像大多数讨论似乎在某个时候消失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 2017-11-10
    相关资源
    最近更新 更多