Pregunta

¿Alguien podría encontrar una manera de mejorar este código un poco? Quiero leer en un archivo INI de una sola vez y crear una estructura de datos correspondiente.

<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>
¿Fue útil?

Solución

No creo que pueda mejorar esto usando la potencia CFML. ¿Necesita analizar grandes archivos ini? Si no es así, ¿por qué le gustaría mejorar su código? Parece bastante sencillo para mí.

Otra solución posible (aunque común para CF) es probar Java puro. Consulte este hilo SO para obtener ejemplos de Java puro .

P.S. Por cierto, en caso de necesidades especiales de rendimiento, debe considerar usar otro almacenamiento para la configuración. La consulta SELECT simple al viejo MySQL bueno puede ser mucho más rápido para grandes conjuntos de datos.

Otros consejos

Para ampliar el comentario de Ryber, puede considerar usar este enfoque en su lugar. Supongo que está utilizando CF8.01 o posterior, ya que uso la notación de estructura implícita anidada. Esto podría convertirse fácilmente a la sintaxis CF7 / 6 / etc., pero no sería tan limpio o conciso.

Una vez más, esto solo se aplica si su archivo ini no es utilizado por otras aplicaciones o personas, y no necesita estar en formato ini.

settings.cfm:

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

Application.cfc: (solo el método onApplicationStart)

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

Además, utilizo la aplicación CFEncode para cifre el contenido de settings.cfm . No lo protegerá de alguien que obtenga una copia del archivo y quiera ver cuáles son sus contenidos cifrados (el cifrado no es tan fuerte y hay formas de ver el contenido sin descifrarlo), pero si solo desea mantener alejadas a algunas personas entrometidas, agrega una pequeña barrera de entrada adicional que podría disuadir a algunas personas.


Actualización: Dado que acaba de dejar un comentario que dice que está en CF7, aquí está la sintaxis nativa 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 />
<!--- ... --->

Alternativamente, puede usar JSONUtil y CFSaveContent para continuar usando un enfoque similar a JSON (similar a mi sintaxis original), pero en CF7:

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

Creé un CFC que uso en un montón de aplicaciones. Le da una ruta de archivo ini cuando lo inicia y crea una estructura basada en el archivo ini. También opcionalmente mantiene la estructura plana o crea subestructuras basadas en las [Secciones] en el archivo ini. Luego puede usar su método getSetting () para obtener métodos individuales o getAllSettings () para devolver toda la estructura. Puede resultarle útil.

<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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top