Frage

Könnte jemand eine Möglichkeit zur Verbesserung der diesen Code ein bisschen finden? Ich möchte in einer INI-Datei in einer lesen fühlte Schlag und eine entsprechende Datenstruktur erstellen.

<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>
War es hilfreich?

Lösung

Ich glaube nicht, dass Sie dies mit CFML Leistung verbessern können. Sie benötigen riesige INI-Dateien zu analysieren? Wenn nicht, warum würden Sie Ihren Code verbessern möchten, ist es für mich ziemlich einfach aussieht.

Andere möglich (obwohl üblich, CF) Lösung zu versuchen, reine Java ist. Siehe diesen Thread für reine Java Beispiele .

P. S. BTW, bei besonderen Leistungsanforderungen sollten Sie mit einem anderen Speicher für Konfiguration berücksichtigen. Einfache SELECT-Abfrage an die gute alte MySQL kann viel schneller für große Datensätze sein.

Andere Tipps

Um auf ryber Kommentar zu erweitern, können Sie stattdessen mit diesem Ansatz in Betracht ziehen. Ich nehme an, Sie verwenden CF8.01 oder später, als ich die Verwendung von verschachtelten impliziten Struktur Notation machen. Dies könnte leicht zu CF7 / 6 / etc Syntax umgewandelt werden, würde aber nicht so sauber oder prägnant sein.

Auch dies gilt nur, wenn Sie Ihre INI-Datei nicht von anderen Anwendungen oder Menschen verwendet wird und nicht Notwendigkeit in ini-Format sein.

settings.cfm:

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

Application.cfc: (nur die OnApplicationStart Methode)

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

Darüber hinaus habe ich die CFEncode Anwendung den Inhalt des settings.cfm verschlüsseln. Es wird Sie nicht von jemandem schützen, die eine Kopie der Datei bekommt und will sehen, was seine verschlüsselten Inhalte sind (die Verschlüsselung ist nicht so stark, und es gibt Möglichkeiten, den Inhalt ohne Entschlüsselung zu sehen), aber wenn Sie nur wollen einige neugierige Menschen fern zu halten, fügt ein wenig zusätzliche Barriere-to-Eintrag, der einige Leute abschrecken könnte.


Update: Da Sie einfach einen Kommentar hinterlassen, die sagt, dass Sie auf CF7 sind, ist hier heimisch CF7 Syntax:

settings.cfm:

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

Alternativ können Sie JSONUtil und cfsavecontent weiterhin einen JSON orientierten Ansatz verwenden (ähnlich wie meine Original-Syntax), aber auf CF7:

<cfsavecontent variable="variables.jsonSettings">
{
    fooSection = {
        fooKey = 'fooVal',
        fooNumber = 2,
    },
    fooSection2 = {
        //...
    },
    fooSection3 = {
        //...
    }
};
</cfsavecontent>
<cfset variables.settings = jsonUtil.deserializeFromJSON(variables.jsonSettings) />

Ich habe einen CFC, die ich in einer Reihe von Anwendungen verwendet werden. Sie geben ihm eine ini filepath, wenn Sie es init und es schafft eine Struktur auf der INI-Datei basiert. Es hält auch optional die Struktur flach oder schafft Unterstrukturen auf der Grundlage der [Abschnitte] in der INI-Datei. Sie können dann entweder seine getSetting() Methode verwenden, um einzelne Methoden zu erhalten oder getAllSettings() die gesamte Struktur zurückzukehren. Sie kann es hilfreich finden.

<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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top