Хлопать INI-файл в CFML - PullRequest
       9

Хлопать INI-файл в CFML

3 голосов
/ 27 октября 2009

Может кто-нибудь найти способ немного улучшить этот код? Я хочу прочитать INI-файл одним махом и создать соответствующую структуру данных.

<cfset INIfile = expandPath(".") & "\jobs.ini">
<cfset profile = GetProfileSections(INIfile)>
<cfloop collection="#profile#" item="section">
    <cfloop list="#profile[section]#" index="entry">
        <cfset app.workflow[section][entry]=GetProfileString(INIfile, section, entry) >
    </cfloop>
</cfloop>

Ответы [ 3 ]

4 голосов
/ 28 октября 2009

Я не верю, что вы можете улучшить это, используя силу CFML. Вам нужно разобрать огромные INI-файлы? Если нет, то почему вы хотите улучшить свой код, для меня это выглядит довольно просто.

Другое возможно (хотя и распространено для CF) решение - попробовать чистую Java. См. Этот поток SO для чистой Java примеров .

P.S. Кстати, в случае особых требований к производительности, вы должны рассмотреть возможность использования другого хранилища для конфигурации. Простой запрос SELECT к старому доброму MySQL может быть намного быстрее для больших наборов данных.

1 голос
/ 18 декабря 2009

Я создал CFC, который я использую в куче приложений. Когда вы его инициализируете, вы задаете путь к файлу ini, и он создает структуру на основе файла ini. Кроме того, при желании структура остается плоской или создается подструктура на основе [Разделов] в INI-файле. Затем вы можете использовать метод getSetting() для получения отдельных методов или getAllSettings() для возврата всей структуры. Вы можете найти это полезным.

<cfcomponent hint="converts INI file to a structure">
    <cfset variables.settings=structNew() />
    <cffunction name="init" access="public" output="false" returntype="any">
        <cfargument name="configurationFile" type="string" required="yes" />
        <cfargument name="useSections" default="false" type="boolean" />
        <cfset var local=structNew() />
        <cfif fileExists(arguments.configurationFile)>
            <!--- Get the [sections] in the .INI file --->
            <cfset local.sectionStruct=getProfileSections(arguments.configurationFile) />
            <!--- Loop over each of these sections in turn --->
            <cfloop collection="#local.sectionStruct#" item="local.item">
                <cfset local.workingStruct=structNew() />
                <cfloop list="#local.sectionStruct[local.item]#" index="local.key">
                    <!--- Loop over the keys in the current section and add the key/value to a temporary structure --->
                    <cfset local.workingStruct[local.key]=getProfileString(arguments.configurationFile,local.item,local.key) />
                </cfloop>
                <cfif arguments.useSections>
                    <!--- Copy the temporary structure to a key in the setting structure for the current section --->
                    <cfset variables.settings[local.item]=duplicate(local.workingStruct) />
                <cfelse>
                    <!--- Append the temporary structure to the setting structure --->
                    <cfset structAppend(variables.settings,local.workingStruct,"yes") />
                </cfif>
            </cfloop>
        <cfelse>
            <cfthrow
                message="Configuration file not found. Must use fully-qualified path."
                extendedinfo="#arguments.configurationFile#"
            />
        </cfif>
        <cfreturn this>
    </cffunction>

    <cffunction name="getAllSettings" access="public" output="false" returntype="struct">
        <cfreturn variables.settings>
    </cffunction>

    <cffunction name="getSetting" access="public" output="false" returntype="string">
        <cfargument name="settingName" required="yes" type="string" />
        <cfset var returnValue="" />

        <cfif structKeyExists(variables.settings,arguments.settingName)>
            <cfset returnValue=variables.settings[arguments.settingName] />
        <cfelse>
            <cfthrow
                message="No such setting '#arguments.settingName#'."
            />
        </cfif>
        <cfreturn returnValue>
    </cffunction>
</cfcomponent>
1 голос
/ 28 октября 2009

Чтобы расширить комментарий Рибера, вы можете рассмотреть возможность использования этого подхода. Я предполагаю, что вы используете CF8.01 или более позднюю версию, так как я использую вложенную неявную структуру. Это может быть легко преобразовано в синтаксис CF7 / 6 / etc, но не будет таким чистым или кратким.

Опять же, это применимо только в том случае, если ваш INI-файл не используется никакими другими приложениями или людьми, и не требуется в формате INI.

settings.cfm:

<cfset variables.settings = {
    fooSection = {
        fooKey = 'fooVal',
        fooNumber = 2,
    },
    fooSection2 = {
        //...
    },
    fooSection3 = {
        //...
    }
} />

Application.cfc: (только метод onApplicationStart)

<cffunction name="onApplicationStart">
    <cfinclude template="settings.cfm" />
    <cfset application.workflow = variables.settings />
    <cfreturn true />
</cffunction>

Кроме того, я использую приложение CFEncode для шифрования содержимого settings.cfm. Он не защитит вас от кого-то, кто получит копию файла и захочет посмотреть, каково его зашифрованное содержимое (шифрование не такое сильное, и есть способы просмотреть содержимое, не расшифровывая его), но если вы просто хочу не пускать любопытных людей, это добавляет немного дополнительного барьера для входа, который может сдерживать некоторых людей.


Обновление: Поскольку вы только что оставили комментарий, в котором говорится, что вы используете CF7, вот собственный синтаксис CF7:

settings.cfm:

<cfset variables.settings = StructNew() />
<cfset variables.settings.fooSection = StructNew() />
<cfset variables.settings.fooSection.fooKey = 'fooVal' />
<cfset variables.settings.fooSection.fooNumber = 2 />
<!--- ... --->

В качестве альтернативы вы можете использовать JSONUtil и CFSaveContent, чтобы продолжать использовать подход, похожий на JSON (аналогично моему первоначальному синтаксису), но для CF7:

<cfsavecontent variable="variables.jsonSettings">
{
    fooSection = {
        fooKey = 'fooVal',
        fooNumber = 2,
    },
    fooSection2 = {
        //...
    },
    fooSection3 = {
        //...
    }
};
</cfsavecontent>
<cfset variables.settings = jsonUtil.deserializeFromJSON(variables.jsonSettings) />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...