编译Python编写程序文件

时间:2013-12-20 23:47:31

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

我编写了一个程序来创建几个sqlite3数据库临时文件。在开发中,我只是将它们存储在与src包相同的文件夹中的文件夹中。我忽略了在编译代码并从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')

到我的程序,它显示文件在那里,但在explorer,cmd或idle中不存在。然而,他们做,出现在cygwin中。

我显示了隐藏的文件/文件夹但它们没有显示。

如果我使用资源管理器复制临时文件夹,则文件不会标记。如果我使用cygwin复制文件夹,他们会这样做。它们也会被探险家看到。

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

1 个答案:

答案 0 :(得分:3)

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

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

  • 如果您是以管理员身份运行,而不是使用XP / 2003或更早版本的模拟运行,则文件将直接写入指定的路径。
  • 如果您的应用符合魔术触发器看起来像安装程序(请参阅here获取Vista文档),则文件将直接写入指定的路径。
  • 如果您的应用程序位于Microsoft的兼容性数据库中,则路径将通过兼容性数据库中的entires进行映射(似乎没有在任何地方记录)。
  • 否则,您的路径将通过UAC文件虚拟化传递,这意味着尝试写入受保护的目录,如Program Files,最终会在用户的应用程序数据目录下的某个位置 - 到您的程序,它看起来比如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是我见过的唯一可以深入细节的地方......除此之外图像和大部分讨论似乎都在某些时候消失了。