任何 Windows 机器上的可写目录

Writeable directory on any Windows machine

我有一个基本的 Windows 问题。我是一个Linux用户,但我负责一个需要在Windows文件系统上运行的程序。

我正在寻找一个安全的、普遍可用的高级目录列表,其中允许任何 Python 程序在任何 Windows 机器上创建目录和文件。

当我们尝试 运行 底部的代码时抛出以下错误消息。

PermissionError: [WinError 5] Access is denied: 'C:\Program Files\arbitrary'

抛出上述错误的代码是:

import os
import platform

cwd = os.getcwd()
platform.system()

print("cwd is: ", cwd)

if platform.system() == 'Windows':
  print('W!')
  drive = cwd.split(':\')[0] + ':\'
  print('drive is: ', drive)

newpath = drive+'Program Files\arbitrary' 
print('newpath is: ', newpath)

if not os.path.exists(newpath):
  os.makedirs(newpath)

很明显,我们的程序没有权限写入Program Files目录。

但是我们不需要我们的用户拥有任何给定目录的权限,我们需要让程序指定写入一个目录,该目录保证对于任何可以 运行 该程序的用户都是可写的。

Windows 上的此类目录通常由 well-known 环境变量引用。您的问题并不完全清楚您是要写入持久数据还是临时数据,以及您是否希望一个用户写入的数据可见and/or 可由另一个用户修改。

如果数据是临时的,则使用 TEMP 环境变量引用的目录。

用户私有的数据通常会写入 APPDATA(随用户漫游)或 LOCALAPPDATA(机器本地)环境变量引用的目录。

要在 用户之间共享的数据应该写在什么地方可能不太清楚。一种选择可能是 PUBLIC 环境变量引用的 public 用户目录中的某处。在那里写入的文件归最初创建它们的用户所有,但默认的继承权限允许其他交互式用户修改它们。

Windows 提供几个 "special" locations 文件存储位置。

如果您需要写入文件,您通常会选择其中之一:

  • CSIDL_APPDATA 漫游到 NT 域中不同计算机的文件。适用于配置文件。也可用作 %AppData% 环境变量。
  • CSIDL_LOCAL_APPDATA 永不漫游的文件。适用于缓存和其他不重要或可以自动重新生成的东西。也可用 %LocalAppData%.
  • CSIDL_PERSONAL 文档。不要在此处存储配置文件。
  • %Public% 一台机器上所有用户共享的文件夹。
  • %Temp%临时目录。仅可用作环境变量。

有关在 Python 中检索这些内容的方法,请参阅 this question