gpt4 book ai didi

python - 来自 python 的 Windows 特殊文件夹和已知文件夹(开始菜单、下载等)

转载 作者:行者123 更新时间:2023-12-01 04:44:01 25 4
gpt4 key购买 nike

确定 Windows 路径的最佳方法是什么 在Python中?

我发现了几种流行的 SpecialFolders 方法,又名 CSIDL ,但对于 KNOWNFOLDERID 来说还没有什么简单的事情。 。保持了向后兼容性,因此 CSIDL 方法仍然有效,但自 Windows XP 以来引入的任何特殊/已知文件夹都不会在那里枚举。 "new"不可用的示例包括下载、播放列表、程序文件 x64。

特殊文件夹

  • Find system folder locations in Python - 最简单的CSIDL方法,依赖于win32com,适用于AllUsersDesktop、AllUsersStartMenu、AllUsersPrograms、AllUsersStartup、Desktop、Favorites、Fonts、MyDocuments、NetHood、PrintHood、Recent、SendTo、StartMenu、Startup & Templates(可能列出不完整)。

  • How to get path of Start Menu's Programs directory? - 具有与上面相同的方法,以及直接使用 ctypes 的方法,因此不需要 win32com(不那么清晰或直接)

已知文件夹

二合一

最佳答案

解决这个问题的方式与那个问题相同:首先,您找到文档,最好找到一些 C++、C# 或 VB 中的不错的示例代码,然后了解如何使用 PyWin32 来制作相同的 shell API 或 IKnownFolder 来自 Python 的 COM 调用。

如 MSDN 概述文档 Known Folders说,您可以使用新的 shell 包装函数 SHGetKnownFolderPath而不是旧的 SHFolderPathSHGetFolderPath,或者您可以使用完整的 IKnownFolderManager通过 COM 接口(interface)。

不幸的是,我面前没有 Windows 机器,并且 MSDN 的示例下载没有响应,所以我将不得不做一些猜测。但它可能是这样的:

from win32com.shell import shell, shellcon
path = shell.SHGetKnownFolderPath(shellcon.FOLDERID_AccountPictures,
0, # see KNOWN_FOLDER_FLAG
0) # current user

如果 shellcon 没有 FOLDERID 值,您必须在 KNOWNFOLDERID 上查找它们。并自己定义您需要的常量。

如果 shell 没有 SHGetKnownFolderPath 函数,您必须实例化 IKnownFolderManager 并调用 GetFolderByName.

如果 shell 甚至没有 IKnownFolderManager...但 Google 会快速显示 it was added in build 218 ,所以这不会成为问题。

<小时/>

如果你宁愿通过ctypes而不是win32com来完成它,它看起来会像这样(再次,未经测试,因为我没有Windows盒子和MSDN服务器坏了):

from ctypes import windll, wintypes
from ctypes import *
from uuid import UUID

# ctypes GUID copied from MSDN sample code
class GUID(Structure):
_fields_ = [
("Data1", wintypes.DWORD),
("Data2", wintypes.WORD),
("Data3", wintypes.WORD),
("Data4", wintypes.BYTE * 8)
]

def __init__(self, uuidstr):
uuid = UUID(uuidstr)
Structure.__init__(self)
self.Data1, self.Data2, self.Data3, self.Data4[0], self.Data4[1], rest = uuid.fields
for i in range(2, 8):
self.Data4[i] = rest>>(8-i-1)*8 & 0xff

FOLDERID_AccountPictures = '{008ca0b1-55b4-4c56-b8a8-4de4b299d3be}'

SHGetKnownFolderPath = windll.shell32.SHGetKnownFolderPath
SHGetKnownFolderPath.argtypes = [
POINTER(GUID), wintypes.DWORD, wintypes.HANDLE, POINTER(c_char_p)]

def get_known_folder_path(uuidstr):
pathptr = c_wchar_p()
guid = GUID(uuidstr)
if SHGetKnownFolderPath(byref(guid), 0, 0, byref(pathptr)):
raise Exception('Whatever you want here...')
return pathptr.value

关于python - 来自 python 的 Windows 特殊文件夹和已知文件夹(开始菜单、下载等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29888071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com