在%APPDATA%中的Windows/Create目录上的配置文件位置

2024-06-02 02:21:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个应用程序,其中包含一个与ConfigParser模块一起使用的配置文件。 这个配置文件实际上存储在%APPDATA%/PressLogReader/PressLogReader.conf中。在

但问题是%APPDATA%/PressLogReader(和配置文件)在应用程序的第一次启动时不存在,因此应用程序崩溃。在

也许我可以在安装应用程序时创建%APPDATA%/PressLogReader文件夹,但我认为这是一个糟糕的解决方案。在

你有更好的解决办法吗?在

这是我的Conf类:

APP_DIRNAME = 'PressLogReader'

if 'APPDATA' in os.environ:
        APP_CONFIG_PATH = os.path.join(os.environ['APPDATA'], APP_DIRNAME)
elif 'XDG_CONFIG_HOME' in os.environ:
    APP_CONFIG_PATH = os.path.join(os.environ['XDG_CONFIG_HOME'], APP_DIRNAME)
else:
    APP_CONFIG_PATH = os.path.join(os.environ['HOME'], '.config', APP_DIRNAME)

APP_CONF_FILE = os.path.join(APP_CONFIG_PATH, 'PressLogReader.conf')

class Config :

    def __init__(self) :
        self.parser = ConfigParser.ConfigParser()

        params = {
            'logFile': 'C:\Program Files\syslog\log\messages',
            'filterByIP': False,
            'IpFilter': ''
        }

        if not os.access(APP_CONF_FILE, os.F_OK | os.W_OK) :
            self.parser.add_section('general')
            for arg in params:
                self.parser.set('general', arg, params[arg])
            self.write()

        self.parser.read(APP_CONF_FILE)
        self.getLogFile()
        self.getFilterByIp()
        self.getIpFilter()

    def write(self) :
        with open(APP_CONF_FILE, 'wb') as conf_file:
            self.parser.write(conf_file)

    def getLogFile(self) :
        try :
            self.log_file = self.parser.get('general', 'logFile')
        except ConfigParser.NoSectionError :
            self.parser.add_section('general')
            self.parser.set('general', 'logFile', params['logFile'])
        except ConfigParser.NoOptionError :
            self.parser.set('general', 'logFile', params['logFile'])
        finally :
            self.log_file = params['logFile']

    def getFilterByIp(self) :
        try :
            self.filter_by_ip = self.parser.getboolean('general', 'filterByIP')
        except ConfigParser.NoSectionError :
            self.parser.add_section('general')
            self.parser.set('general', 'filterByIP', params['filterByIP'])
        except ConfigParser.NoOptionError :
            self.parser.set('general', 'filterByIP', params['filterByIP'])
        finally :
            self.filter_by_ip = params['filterByIP']

    def getIpFilter(self) :
        try :
            self.ip_filter = self.parser.get('general', 'IpFilter')
        except ConfigParser.NoSectionError :
            self.parser.add_section('general')
            self.parser.set('general', 'IpFilter', params['IpFilter'])
        except ConfigParser.NoOptionError :
            self.parser.set('general', 'IpFilter', params['IpFilter'])
        finally :
            self.ip_filter = params['IpFilter']

Tags: selfconfigappparserosenvironparamsconfigparser
1条回答
网友
1楼 · 发布于 2024-06-02 02:21:11

此代码段将检查中的文件夹中是否存在PressLogReader文件操作系统环境与键APPDATA关联的:

APP_DIRNAME = 'PressLogReader'

if not os.path.exists(os.path.join(os.environ['APPDATA'],APP_DIRNAME)):
    os.mkdir(os.path.join(os.environ['APPDATA'],APP_DIRNAME))

您可以通过重写它来扩展它,以便它在创建新文件夹之前检查配置文件可能已放置的每个位置。解决方案的实质是一样的,所以留给读者作为练习。在

顺便说一句,这是我们的配置文件-为什么要担心它在多个地方?您是否有需要将其放在其他地方的遗留代码,或者这可能是为了跨平台的ines?在

编辑:

您还可以使用os.path.exists(file_path)检查系统上是否存在文件。因此,也许您不必检查os.path.exists(os.path.join(os.environ['APPDATA'], APP_DIRNAME)),而是在需要检查的每个目录中检查os.path.exists(os.path.join(os.environ['APPDATA'], APP_DIRNAME, 'PressLogReader.conf'))。在

相关问题 更多 >