ฉันขอแนะนำให้คุณหลีกเลี่ยงการจัดเก็บไฟล์และไดเรกทอรีโดยตรงในโฟลเดอร์โปรไฟล์ของผู้ใช้ (เช่น ตัวแปรสภาพแวดล้อม UserProfile
) หรือโฟลเดอร์หลัก (เช่น "%HomeDrive%%HomePath%"
) สิ่งนี้แตกต่างจากวิธีปฏิบัติทั่วไปใน Unix สำหรับโฮมไดเร็กตอรี่ (หากเราเพิกเฉยต่อข้อมูลจำเพาะไดเร็กทอรีฐาน XDG) แต่เมื่ออยู่ใน Redmond ให้ทำตามที่ Microsofties ทำ
สร้างโฟลเดอร์ที่มีชื่อเฉพาะสำหรับแอปพลิเคชันในตำแหน่งต่อไปนี้อย่างน้อยหนึ่งตำแหน่ง: โฟลเดอร์ข้อมูลภายในเครื่อง (ต่อผู้ใช้) โฟลเดอร์ข้อมูลการโรมมิ่ง (ต่อผู้ใช้) หรือโฟลเดอร์ข้อมูลโปรแกรม (ต่อเครื่อง) โปรดทราบว่าโฟลเดอร์เหล่านี้จะถูกซ่อนไว้โดยค่าเริ่มต้น เนื่องจากโดยทั่วไปแล้วผู้ใช้ไม่ได้ถูกกำหนดให้เข้าถึงโดยตรง
ใช้โฟลเดอร์ข้อมูลในเครื่องสำหรับแคช ใช้โฟลเดอร์ข้อมูลโรมมิ่งสำหรับข้อมูลผู้ใช้และการกำหนดค่าแบบมีสถานะ ใช้โฟลเดอร์ข้อมูลโปรแกรมสำหรับข้อมูลและแคชที่ไม่เฉพาะเจาะจงสำหรับผู้ใช้ ตัวอย่างเช่น โปรแกรมอย่าง pip สามารถใช้โฟลเดอร์ข้อมูลโปรแกรมเพื่อแคชแพ็คเกจที่ดาวน์โหลด (ในทางปฏิบัติ pip แคชแพ็กเกจต่อผู้ใช้ แต่โดยหลักการแล้ว มันสามารถแคชต่อเครื่องได้)
หากแอปพลิเคชันของคุณใช้โฟลเดอร์ข้อมูลโปรแกรม ตรวจสอบให้แน่ใจว่าโฟลเดอร์นั้นให้สิทธิ์ผู้ใช้ทั้งหมดในการเพิ่มและแก้ไขโฟลเดอร์ย่อยและไฟล์ หากคุณสร้างโฟลเดอร์อย่างเกียจคร้าน คุณสามารถเพิ่มการอนุญาตด้วยตนเองได้ ดูคำตอบนี้เพื่อดูตัวอย่างวิธีแก้ไขความปลอดภัยของไฟล์
ตัวแปรสภาพแวดล้อมสำหรับโฟลเดอร์ข้อมูลโลคัล โรมมิ่ง และโปรแกรมคือ LocalAppData
, AppData
และ ProgramData
ตามลำดับ ใน Windows XP ค่าหลังคือ "%AllUsersProfile%\Application Data"
และอาจมีการแปล "ข้อมูลแอปพลิเคชัน" โดยทั่วไปคุณไม่ควรใช้ตัวแปรสภาพแวดล้อมเหล่านี้ในแอปพลิเคชัน
เนื่องจากโฟลเดอร์ที่รู้จัก/พิเศษส่วนใหญ่สามารถย้ายตำแหน่งได้ง่ายใน Explorer จึงควรถามเชลล์สำหรับเส้นทางปัจจุบันโดยการเรียก SHGetFolderPath
หรือฟังก์ชัน SHGetKnownFolderPath
ที่ใหม่กว่า แทนที่จะใช้ตัวแปรสภาพแวดล้อมและตำแหน่งเริ่มต้น คุณสามารถใช้ ctypes สำหรับสิ่งนี้ได้หากคุณต้องการอยู่ในไลบรารีมาตรฐานของ Python แต่ใช้ 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
SHGetKnownFolderPath
ไม่ได้ถูกห่อด้วย PyWin32 ฉันมีคำตอบอื่นที่เรียกมันผ่าน 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()
หรือเรียกใช้ฟังก์ชันเดิม SHGetFolderPath
ด้วยค่าคงที่ CSIDL
ตัวอย่างเช่น:
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