Question

Quelqu'un pourrait-il trouver un moyen d'améliorer légèrement ce code? Je veux lire dans un fichier INI d'un seul coup et créer une structure de données correspondante.

<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>
Était-ce utile?

La solution

Je ne crois pas que vous puissiez améliorer cela en utilisant le pouvoir de CFML. Avez-vous besoin d’analyser d’énormes fichiers ini? Sinon, pourquoi voudriez-vous améliorer votre code, cela me semble assez simple.

Une autre solution possible (bien que courante pour CF) consiste à essayer du langage Java pur. Voir ce fil SO pour du pur Java

Autres conseils

Pour développer le commentaire de ryber, vous pouvez utiliser cette approche à la place. Je suppose que vous utilisez CF8.01 ou une version ultérieure, car je me sers de la notation à structure implicite imbriquée. Cela pourrait facilement être converti en syntaxe CF7 / 6 / etc, mais ne serait pas aussi clair et concis.

Encore une fois, cela ne s'applique que si votre fichier ini n'est utilisé par aucune autre application ou personne et si il n'a pas besoin d'être au format ini.

settings.cfm:

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

Application.cfc: (uniquement la méthode onApplicationStart)

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

De plus, j'utilise l'application CFEncode pour chiffrer le contenu de settings.cfm . Cela ne vous protègera pas de quelqu'un qui obtient une copie du fichier et souhaite voir quel est son contenu crypté (le cryptage n'est pas si fort, et il existe des moyens de voir le contenu sans le décrypter), mais veulent garder certaines personnes curieuses, cela ajoute un petit obstacle supplémentaire à l'entrée qui pourrait décourager certaines personnes.


Mise à jour : puisque vous venez de laisser un commentaire indiquant que vous êtes sur CF7, voici la syntaxe native de CF7:

settings.cfm:

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

Vous pouvez également utiliser les JSONUtil et CFSaveContent pour continuer à utiliser une approche JSON (similaire à mon syntaxe originale), mais sur CF7:

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

J'ai créé un CFC que j'utilise dans de nombreuses applications. Vous lui donnez un chemin de fichier ini lorsque vous l'initialisez et il crée une structure basée sur le fichier ini. Cela permet également de garder la structure à plat ou de créer des sous-structures basées sur les [Sections] du fichier ini. Vous pouvez ensuite utiliser sa méthode getSetting () pour obtenir des méthodes individuelles ou getAllSettings () pour renvoyer la structure entière. Vous le trouverez peut-être 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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top