Saya menyarankan agar Anda menghindari menyimpan file dan direktori secara langsung di folder profil pengguna (yaitu variabel lingkungan UserProfile
) atau folder rumah (yaitu "%HomeDrive%%HomePath%"
). Ini berbeda dari praktik umum di Unix untuk direktori home (jika kita mengabaikan spesifikasi direktori dasar XDG), namun saat berada di Redmond, lakukan seperti yang dilakukan Microsofties.
Buat folder dengan nama unik untuk aplikasi di satu atau beberapa lokasi berikut: folder data lokal (per pengguna), folder data roaming (per pengguna), atau folder data program (per mesin). Perhatikan bahwa folder-folder ini disembunyikan secara default karena umumnya pengguna tidak dimaksudkan untuk mengaksesnya secara langsung.
Gunakan folder data lokal untuk cache. Gunakan folder data roaming untuk data pengguna dan konfigurasi stateful. Gunakan folder data program untuk data dan cache yang tidak spesifik untuk pengguna. Misalnya, program seperti pip dapat menggunakan folder data program untuk menyimpan cache paket yang diunduh. (Dalam praktiknya, pip menyimpan cache paket per pengguna, namun pada prinsipnya dapat melakukan cache per mesin.)
Jika aplikasi Anda menggunakan folder data program, pastikan folder tersebut memberikan izin kepada semua pengguna untuk menambah dan mengubah subfolder dan file. Jika Anda malas membuat folder, Anda dapat menambahkan izin secara manual. Lihat jawaban ini untuk contoh cara mengubah keamanan file.
Variabel lingkungan untuk folder lokal, roaming, dan data program masing-masing adalah LocalAppData
, AppData
dan ProgramData
. Di Windows XP yang terakhir adalah "%AllUsersProfile%\Application Data"
, dan mungkin "Data Aplikasi" dilokalkan. Umumnya Anda tidak boleh menggunakan variabel lingkungan ini dalam aplikasi.
Karena sebagian besar folder yang dikenal/khusus mudah dipindahkan di Explorer, yang terbaik adalah menanyakan jalur saat ini pada shell dengan memanggil SHGetFolderPath
atau fungsi SHGetKnownFolderPath
yang lebih baru daripada menggunakan variabel lingkungan dan lokasi default. Anda dapat menggunakan ctypes untuk ini jika Anda ingin tetap berada dalam perpustakaan standar Python. Namun lebih mudah menggunakan PyWin32, yang dapat diinstal pip sebagai paket "pypiwin32".
Berikut adalah beberapa GUID Folder yang Dikenal untuk data, dokumen, dan file media:
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
Berikut adalah konstanta CSIDL
yang terkait, kecuali tidak ada satu pun untuk "Unduhan":
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
SHGetKnownFolderPath
tidak dibungkus oleh PyWin32. Saya punya jawaban lain yang memanggilnya melalui ctypes. Alternatifnya, Anda dapat menggunakan PyWin32 untuk membuat instance KnownFolderManager
. Misalnya:
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()
Atau panggil fungsi SHGetFolderPath
lama dengan konstanta CSIDL
. Misalnya:
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)
person
Eryk Sun
schedule
24.09.2017