我建議您避免將文件和目錄直接存儲在用戶的配置文件文件夾(即UserProfile
環境變量)或主文件夾(即"%HomeDrive%%HomePath%"
)中。這不同於在Unix上常見的做法主目錄(如果我們忽略XDG基目錄規範),但是當在雷蒙德,做作爲Microsofties做。
在以下一個或多個位置爲應用程序創建一個唯一命名的文件夾:本地數據文件夾(每個用戶),漫遊數據文件夾(每個用戶)或程序數據文件夾(每個用戶)機)。請注意,這些文件夾默認情況下處於隱藏狀態,因爲通常用戶並不打算直接訪問它們。
使用本地數據文件夾緩存。使用漫遊數據文件夾進行有狀態的用戶數據和配置。將程序數據文件夾用於不特定於用戶的數據和高速緩存。例如,像pip這樣的程序可以使用程序數據文件夾來緩存下載的軟件包。 (實際上,每個用戶的點緩存包,但原則上它可以緩存每臺機器。)
如果您的應用程序使用程序數據文件夾,請確保該文件夾授予所有用戶添加和修改子文件夾和文件的權限。如果您懶懶地創建文件夾,則可以手動添加權限。對於如何修改文件安全的示例見this answer。
本地,漫遊和程序數據文件夾的環境變量分別爲LocalAppData
,AppData
和ProgramData
。在Windows XP中,後者是"%AllUsersProfile%\Application Data"
,並且可能「應用程序數據」已本地化。通常,您不應該在應用程序中使用這些環境變量。
由於大多數已知/特殊文件夾在資源管理器中輕鬆地重定位,最好通過調用SHGetFolderPath
或較新的SHGetKnownFolderPath
功能,而不是使用環境變量和默認位置,要求電流通路的外殼。如果你需要留在Python的標準庫中,你可以使用ctypes。但使用PyWin32更容易,可以將pip安裝爲「pypiwin32」包。
下面是數據,文檔和媒體文件的一些Known Folder的GUID:
User System
ProgramData FOLDERID_ProgramData
Local FOLDERID_LocalAppData
Roaming FOLDERID_RoamingAppData
Desktop FOLDERID_Desktop FOLDERID_PublicDesktop
Documents FOLDERID_Documents FOLDERID_PublicDocuments
Downloads FOLDERID_Downloads FOLDERID_PublicDownloads
Music FOLDERID_Music FOLDERID_PublicMusic
Pictures FOLDERID_Pictures FOLDERID_PublicPictures
Videos FOLDERID_Videos FOLDERID_PublicVideos
這裏有相應的CSIDL
常量,但沒有一個 「下載」:
User System
ProgramData CSIDL_COMMON_APPDATA
Local CSIDL_LOCAL_APPDATA
Roaming CSIDL_APPDATA
Desktop CSIDL_DESKTOP CSIDL_COMMON_DESKTOPDIRECTORY
Documents CSIDL_PERSONAL CSIDL_COMMON_DOCUMENTS
Music CSIDL_MYMUSIC CSIDL_COMMON_MUSIC
Pictures CSIDL_MYPICTURES CSIDL_COMMON_PICTURES
Videos CSIDL_MYVIDEO CSIDL_COMMON_VIDEO
PyWin32不包含SHGetKnownFolderPath
。我有another answer,通過ctypes調用它。或者,您可以使用PyWin32創建KnownFolderManager
實例。例如:
import pythoncom
from win32com.shell import shell
kf_mgr = pythoncom.CoCreateInstance(shell.CLSID_KnownFolderManager, None,
pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IKnownFolderManager)
downloads_path = kf_mgr.GetFolder(shell.FOLDERID_Downloads).GetPath()
或致電與CSIDL
不變的傳統SHGetFolderPath
功能。例如:
from win32com.shell import shell, shellcon
SHGFP_TYPE_CURRENT = 0
SHGFP_TYPE_DEFAULT = 1
local_data_path = shell.SHGetFolderPath(None, shellcon.CSIDL_LOCAL_APPDATA,
None, SHGFP_TYPE_CURRENT)
我真的很感謝這個詳細的答案eryksun。這個答案對許多Windows 10 Python 3開發人員非常有用。 Stackoverflow是一個很好的解決方案來源,尤其是對於像Windows 10這樣的公共平臺上學習基礎知識的開發人員而言。 –