Domanda

Qualcuno potrebbe trovare un modo per migliorare un po 'questo codice? Voglio leggere in un file INI in un colpo solo e creare una struttura di dati corrispondente.

<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>
È stato utile?

Soluzione

Non credo che tu possa migliorarlo usando il potere CFML. Hai bisogno di analizzare enormi file INI? In caso contrario, perché vorresti migliorare il tuo codice, sembra abbastanza semplice per me.

Un'altra soluzione possibile (sebbene comune per CF) è provare Java puro. Vedi questo thread SO per puro esempi Java

Altri suggerimenti

Per espandere il commento di Ryber, potresti prendere in considerazione l'utilizzo di questo approccio. Suppongo che tu stia utilizzando CF8.01 o versioni successive, poiché utilizzo la notazione di struttura implicita nidificata. Questo potrebbe essere facilmente convertito nella sintassi CF7 / 6 / etc, ma non sarebbe altrettanto pulito o conciso.

Ancora una volta, questo vale solo se il tuo file ini non è utilizzato da altre applicazioni o persone e non deve essere in formato ini.

settings.cfm:

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

Application.cfc: (solo il metodo onApplicationStart)

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

Inoltre, ho usato l'applicazione CFEncode per crittografare il contenuto di settings.cfm . Non ti proteggerà da qualcuno che ottiene una copia del file e vuole vedere quali sono i suoi contenuti crittografati (la crittografia non è così forte e ci sono modi per vedere i contenuti senza decrittografarli), ma se solo voglio tenere fuori alcune persone ficcanaso, aggiunge un po 'di barriera in più che potrebbe scoraggiare alcune persone.


Aggiornamento: poiché hai appena lasciato un commento che dice che sei su CF7, ecco la sintassi CF7 nativa:

settings.cfm:

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

In alternativa, puoi utilizzare JSONUtil e CFSaveContent per continuare a utilizzare un approccio simile a JSON (simile al mio sintassi originale), ma su CF7:

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

Ho creato un CFC che utilizzo in diverse app. Gli dai un percorso file ini quando lo avvii e crea una struttura basata sul file ini. Opzionalmente mantiene piatta la struttura o crea sottostrutture basate sulle [Sezioni] nel file ini. È quindi possibile utilizzare il metodo getSetting () per ottenere singoli metodi o getAllSettings () per restituire l'intera struttura. Potresti trovarlo utile.

<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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top