Используйте cfdirectory, чтобы найти несопоставленные файлы в двух каталогах и выполнить функцию

В моем приложении пользователь загружает фотографии, и cfc изменяет размер фотографии, создает новое изображение и изменяет размер этого нового изображения до миниатюры. Проблема в том, что эта функция не была доступна ранее в игре. Теперь я хочу заглянуть в каталог изображений и выяснить, какие изображения не имеют миниатюр.

Я думаю, что я мог бы использовать cfdirectory для вывода структуры обоих каталогов, затем циклически перебирать файлы, которые только существуют в изображениях, а не в каталоге эскизов, и запускать функцию для изменения размера изображений и отправки их в каталог эскизов.

Это ошибочное мышление? Есть ли более простой способ?


person Ofeargall    schedule 20.10.2011    source источник
comment
На разовую операцию? Сколько файлов в каждом и каково соглашение об именах?   -  person Leigh    schedule 21.10.2011
comment
@Leigh Это разовая операция. В одной папке около 500 файлов и 400 в папке эскизов. Все они имеют одно и то же имя, просто разные папки... Я использую имя файла миниатюры с некоторым jQuery для вызова большего изображения из папки изображений.   -  person Ofeargall    schedule 21.10.2011


Ответы (1)


Это вполне разумный подход, и вам даже не нужно использовать рекурсивный код. Просто используйте рекурсивную опцию в CFDirectory, чтобы получить список всех файлов, и используйте как имя файла, так и путь в качестве ключа, что гарантирует уникальный файл, который вы проверяете. Возможно, вам придется немного изменить результат, чтобы вы точно знали, куда поместить новый эскиз, но это должно приблизить вас к результату.

<cfset originals_path = expandPath('originals') />
<cfset thumbs_path = expandPath('thumbs') />

<cfset no_thumbs = find_missing_thumbs(originals_path, thumbs_path) />
<cfdump var="#no_thumbs#" />

<cffunction name="find_missing_thumbs">
    <cfargument name="o" />
    <cfargument name="t" />

    <cfset var originals = 0 />
    <cfset var thumbs = 0 />
    <cfset var missing_thumbs = [] />
    <cfset var massaged_originals = 0 />
    <cfset var massaged_thumbs = 0 />
    <cfset var qSearch = 0 />

    <cfdirectory action="list" directory="#arguments.o#" name="originals" recurse="true" />
    <cfdirectory action="list" directory="#arguments.t#" name="thumbs" recurse="true" />

    <cfquery name="massaged_originals" dbtype="query">
        select name, directory + name as fullpath from originals
    </cfquery>
    <cfquery name="massaged_thumbs" dbtype="query">
        select name, directory + name as fullpath from thumbs
    </cfquery>

    <cfloop query="massaged_originals">
        <cfquery name="qSearch" dbtype="query">
            select massaged_thumbs.name from massaged_thumbs where massaged_thumbs.fullpath = '#massaged_originals.fullpath#'
        </cfquery>
        <cfif qSearch.recordCount eq 0>
            <cfset arrayAppend(missing_thumbs, massaged_originals.name) />
        </cfif>
    </cfloop>
    <cfreturn missing_thumbs />
</cffunction>
person Adam Tuttle    schedule 21.10.2011
comment
Я наткнулся на этот маленький драгоценный камень на днях, и, похоже, он работает очень хорошо! Он использует not fileExists при сравнении каталогов. <cfloop query="images"> <cfif isImageFile("#imageDir#/#name#")> <cfif not fileExists("#thumbDir#/#name#")> <cfimage action="read" source="#imageDir#/#name#" name="image"> <cfset imageScaleToFit(image, 170, 140, "highPerformance")> <cfset imageWrite(image, "#thumbDir#/#name#",true)> </cfif> </cfif> </cfloop> - person Ofeargall; 04.11.2011
comment
Все это начинается с <cfdirectory directory="#imageDir#" name="images">... И это работает только в том случае, если изображения в обеих папках имеют одинаковое имя. - person Ofeargall; 04.11.2011