Index: Lib/test/test_winpath.py =================================================================== --- Lib/test/test_winpath.py (revision 0) +++ Lib/test/test_winpath.py (revision 0) @@ -0,0 +1,37 @@ +"""Tests for winpath module + +Copyright (c) 2008 Christian Heimes +""" + +import os +import unittest +import winpath + +from test import test_support + +class WinPathTests(unittest.TestCase): + def test_winpath_general(self): + for fname, func in vars(winpath).items(): + if not fname.startswith("get") or fname == "get_folder_by_name": + continue + res = func() + if not isinstance(res, dict): + self.assertEqual(type(res), unicode, fname) + if res: + self.assert_(os.path.isdir(res), fname) + continue + for name, value in res.items(): + self.assertEqual(type(value), unicode, name) + if value: + self.assert_(os.path.isdir(value), name) + + def test_by_name(self): + for name, value in winpath.get_shell_folders().items(): + byname = winpath.get_folder_by_name(name) + self.assertEqual(value, byname) + +def test_main(): + test_support.run_unittest(WinPathTests) + +if __name__ == "__main__": + test_main() Property changes on: Lib\test\test_winpath.py ___________________________________________________________________ Name: svn:keywords + Id Name: svn:eol-style + native Index: Lib/winpath.py =================================================================== --- Lib/winpath.py (revision 0) +++ Lib/winpath.py (revision 0) @@ -0,0 +1,113 @@ +"""Windows path module + +Easy access to Windows folders like My Documents + +Copyright (c) 2008 Christian Heimes +""" +import _winreg +import os as _os + +_HKCU = _winreg.HKEY_CURRENT_USER +_HKLM = _winreg.HKEY_LOCAL_MACHINE +_SHELL_FOLDERS = r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" +_USER_SHELL_FOLDERS = r"Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" + +def _query_reg(root, key, name): + with _winreg.OpenKey(root, key) as subkey: + try: + value = _winreg.QueryValueEx(subkey, name) + except WindowsError: + return None + else: + if value[1] == _winreg.REG_EXPAND_SZ: + return _winreg.ExpandEnvironmentStrings(value[0]) + else: + return value[0] + +def _enum_shellfolder(root, shellfolder): + """Enumerate a shell folder and return a mapping + """ + sfolders = {} + i = 0 + with _winreg.OpenKey(root, shellfolder) as key: + while True: + try: + res = _winreg.EnumValue(key, i) + i = i + 1 + if res[2] == _winreg.REG_EXPAND_SZ: + value = _winreg.ExpandEnvironmentStrings(res[1]) + else: + value = res[1] + sfolders[res[0]] = value + except WindowsError: + break + return sfolders + +def get_appdata(): + """Application data folder + """ + return _query_reg(_HKCU, _SHELL_FOLDERS, "AppData") + +def get_mydocuments(): + """My Documents folder + """ + return _query_reg(_HKCU, _SHELL_FOLDERS, "Personal") + +def get_desktop(): + """Desktop path + """ + return _query_reg(_HKCU, _SHELL_FOLDERS, "Desktop") + +def get_favorites(): + """Favorites path + """ + return _query_reg(_HKCU, _SHELL_FOLDERS, "Favorites") + +def get_localsettings(): + """Local Settings path + """ + return _query_reg(_HKCU, _SHELL_FOLDERS, "Local Settings") + +def get_autostart(): + """Auto start (start menu group) + """ + return _query_reg(_HKCU, _SHELL_FOLDERS, "Startup") + +def get_windir(): + """Windows installation path (%WINDIR%) + """ + return _winreg.ExpandEnvironmentStrings(u"%WINDIR%") + +def get_programfiles(): + """Program file path + """ + return _winreg.ExpandEnvironmentStrings(u"%PROGRAMFILES%") + +def get_home(): + """Home directory + """ + return unicode(_os.path.expanduser("~"), "mbcs") + +def get_folder_by_name(name, root=_HKCU): + """Get a shell folder by name + """ + folder = _query_reg(root, _SHELL_FOLDERS, name) + if folder is None: + folder = _query_reg(root, _USER_SHELL_FOLDERS, name) + if folder is None: + raise KeyError("Unknown folder '%s'" % name) + return folder + +def get_shell_folders(): + """Shell folders information + """ + sfolders = _enum_shellfolder(_HKCU, _SHELL_FOLDERS) + sfolders.update(_enum_shellfolder(_HKCU, _USER_SHELL_FOLDERS)) + return sfolders + +def get_common_shell_folders(): + """Common shell folders information + """ + sfolders = _enum_shellfolder(_HKLM, _SHELL_FOLDERS) + sfolders.update(_enum_shellfolder(_HKLM, _USER_SHELL_FOLDERS)) + return sfolders Property changes on: Lib\winpath.py ___________________________________________________________________ Name: svn:keywords + Id Name: svn:eol-style + native