anki/aqt/winpaths.py
2019-03-05 09:59:21 +10:00

169 lines
4.6 KiB
Python

# -*- coding: utf-8 -*-
"""
System File Locations
Retrieves common system path names on Windows XP/Vista
Depends only on ctypes, and retrieves path locations in Unicode
"""
import ctypes
from ctypes import windll, wintypes
__license__ = "MIT"
__version__ = "0.2"
__author__ = "Ryan Ginstrom"
__description__ = "Retrieves common Windows system paths as Unicode strings"
class PathConstants(object):
"""
Define constants here to avoid dependency on shellcon.
Put it in a class to avoid polluting namespace
"""
CSIDL_DESKTOP = 0
CSIDL_PROGRAMS = 2
CSIDL_PERSONAL = 5
CSIDL_FAVORITES = 6
CSIDL_STARTUP = 7
CSIDL_RECENT = 8
CSIDL_SENDTO = 9
CSIDL_BITBUCKET = 10
CSIDL_STARTMENU = 11
CSIDL_MYDOCUMENTS = 12
CSIDL_MYMUSIC = 13
CSIDL_MYVIDEO = 14
CSIDL_DESKTOPDIRECTORY = 16
CSIDL_DRIVES = 17
CSIDL_NETWORK = 18
CSIDL_NETHOOD = 19
CSIDL_FONTS = 20
CSIDL_TEMPLATES = 21
CSIDL_COMMON_STARTMENU = 22
CSIDL_COMMON_PROGRAMS = 23
CSIDL_COMMON_STARTUP = 24
CSIDL_COMMON_DESKTOPDIRECTORY = 25
CSIDL_APPDATA = 26
CSIDL_PRINTHOOD = 27
CSIDL_LOCAL_APPDATA = 28
CSIDL_ALTSTARTUP = 29
CSIDL_COMMON_ALTSTARTUP = 30
CSIDL_COMMON_FAVORITES = 31
CSIDL_INTERNET_CACHE = 32
CSIDL_COOKIES = 33
CSIDL_HISTORY = 34
CSIDL_COMMON_APPDATA = 35
CSIDL_WINDOWS = 36
CSIDL_SYSTEM = 37
CSIDL_PROGRAM_FILES = 38
CSIDL_MYPICTURES = 39
CSIDL_PROFILE = 40
CSIDL_SYSTEMX86 = 41
CSIDL_PROGRAM_FILESX86 = 42
CSIDL_PROGRAM_FILES_COMMON = 43
CSIDL_PROGRAM_FILES_COMMONX86 = 44
CSIDL_COMMON_TEMPLATES = 45
CSIDL_COMMON_DOCUMENTS = 46
CSIDL_COMMON_ADMINTOOLS = 47
CSIDL_ADMINTOOLS = 48
CSIDL_CONNECTIONS = 49
CSIDL_COMMON_MUSIC = 53
CSIDL_COMMON_PICTURES = 54
CSIDL_COMMON_VIDEO = 55
CSIDL_RESOURCES = 56
CSIDL_RESOURCES_LOCALIZED = 57
CSIDL_COMMON_OEM_LINKS = 58
CSIDL_CDBURN_AREA = 59
# 60 unused
CSIDL_COMPUTERSNEARME = 61
class WinPathsException(Exception):
pass
def _err_unless_zero(result):
if result == 0:
return result
else:
raise WinPathsException("Failed to retrieve windows path: %s" % result)
_SHGetFolderPath = windll.shell32.SHGetFolderPathW
_SHGetFolderPath.argtypes = [wintypes.HWND,
ctypes.c_int,
wintypes.HANDLE,
wintypes.DWORD, wintypes.LPCWSTR]
_SHGetFolderPath.restype = _err_unless_zero
def _get_path_buf(csidl):
path_buf = ctypes.create_unicode_buffer(wintypes.MAX_PATH)
result = _SHGetFolderPath(0, csidl, 0, 0, path_buf)
return path_buf.value
def get_local_appdata():
return _get_path_buf(PathConstants.CSIDL_LOCAL_APPDATA)
def get_appdata():
return _get_path_buf(PathConstants.CSIDL_APPDATA)
def get_desktop():
return _get_path_buf(PathConstants.CSIDL_DESKTOP)
def get_programs():
"""current user -> Start menu -> Programs"""
return _get_path_buf(PathConstants.CSIDL_PROGRAMS)
def get_admin_tools():
"""current user -> Start menu -> Programs -> Admin tools"""
return _get_path_buf(PathConstants.CSIDL_ADMINTOOLS)
def get_common_admin_tools():
"""all users -> Start menu -> Programs -> Admin tools"""
return _get_path_buf(PathConstants.CSIDL_COMMON_ADMINTOOLS)
def get_common_appdata():
return _get_path_buf(PathConstants.CSIDL_COMMON_APPDATA)
def get_common_documents():
return _get_path_buf(PathConstants.CSIDL_COMMON_DOCUMENTS)
def get_cookies():
return _get_path_buf(PathConstants.CSIDL_COOKIES)
def get_history():
return _get_path_buf(PathConstants.CSIDL_HISTORY)
def get_internet_cache():
return _get_path_buf(PathConstants.CSIDL_INTERNET_CACHE)
def get_my_pictures():
"""Get the user's My Pictures folder"""
return _get_path_buf(PathConstants.CSIDL_MYPICTURES)
def get_personal():
"""AKA 'My Documents'"""
return _get_path_buf(PathConstants.CSIDL_PERSONAL)
get_my_documents = get_personal
def get_program_files():
return _get_path_buf(PathConstants.CSIDL_PROGRAM_FILES)
def get_program_files_common():
return _get_path_buf(PathConstants.CSIDL_PROGRAM_FILES_COMMON)
def get_system():
"""Use with care and discretion"""
return _get_path_buf(PathConstants.CSIDL_SYSTEM)
def get_windows():
"""Use with care and discretion"""
return _get_path_buf(PathConstants.CSIDL_WINDOWS)
def get_favorites():
return _get_path_buf(PathConstants.CSIDL_FAVORITES)
def get_startup():
"""current user -> start menu -> programs -> startup"""
return _get_path_buf(PathConstants.CSIDL_STARTUP)
def get_recent():
return _get_path_buf(PathConstants.CSIDL_RECENT)