您如何获得“我的文档”的确切路径?
Posted
技术标签:
【中文标题】您如何获得“我的文档”的确切路径?【英文标题】:How do you get the exact path to "My Documents"? 【发布时间】:2010-10-13 19:26:02 【问题描述】:在 C++ 中,在 Windows XP 和 Windows 7 中获取 shell 调用的“我的文档”以及在 Vista 中调用“文档”的文件夹的完整路径名并不难;见Get path to My Documents
有没有简单的方法在 Python 中做到这一点?
【问题讨论】:
我对windows了解不多,但是os.environ['HOMEPATH']
不是通常在windows系统上定义的吗?
@Joe,在我的系统上os.environ['HOMEPATH']
返回'\\'
。
@Mark - 啊,我很抱歉......它似乎在我可以访问的几台 XP 机器上工作,我隐约记得它是标准的......我猜不是!跨度>
+1 表示不想使用“我的文档”文件夹的硬编码路径。
令人恼火的是,Windows 没有为此包含环境变量。尝试使用 HOMEPATH 或 USERPROFILE 会烧毁你,因为不能保证其中存在所述目录,因为本地化或系统管理员已移动它。
【参考方案1】:
您可以使用 ctypes 模块来获取“我的文档”目录:
import ctypes
from ctypes.wintypes import MAX_PATH
dll = ctypes.windll.shell32
buf = ctypes.create_unicode_buffer(MAX_PATH + 1)
if dll.SHGetSpecialFolderPathW(None, buf, 0x0005, False):
print(buf.value)
else:
print("Failure!")
来源:http://bugs.python.org/issue1763#msg62242
【讨论】:
我会给 +1,但使用 ANSI 版本可能会限制使用默认代码页之外的字符的目录。 @Adrian McCarthy,谢谢,我没有注意到。我已将答案更改为使用 unicode 版本。 我认为魔法常数 0x0005 是 CSIDL_PERSONAL。魔术常数 300 是在某处记录的,还是只是 MAX_PATH 添加了一些任意填充? FWIW,如果成功,SHGetSpecialFolderPathW()
调用返回 True,否则返回 False,因此可以检查以确定是否在 buf.value
中放置了任何有用的东西。
仅供参考:在回答类似问题时,我发现您可以通过简单地从 ctypes
模块中导入 wintypes
来避免对 MAX_PATH 进行硬编码:from ctypes import wintypes
。现在无需将 MAX_PATH 硬编码为 260
,您可以像这样访问它:wintypes.MAX_PATH
。以上是关于您如何获得“我的文档”的确切路径?的主要内容,如果未能解决你的问题,请参考以下文章