Копирование файлов в папки с помощью ColdFusion (openBD Engine)

Меня попросили решить следующую проблему: скопировать файлы по 3 штуки во вновь созданные папки. Пример: в папке, скажем, «D: / TEST_CF /» находится 20 текстовых файлов. Разделите их на 3 (пакет - дайте нам 6 остатков 2), создайте 7 папок (чтобы поместить пакеты из 3 в 6 папок и оставшиеся 2 файла в 7-ю папку). До сих пор я создавал необходимые папки. Но я не могу скопировать файлы группами по 3 во вновь созданных папках. Как мне решить указанную выше проблему?

Блок кода

<html>
<body>

<cfprocessingdirective pageencoding="UTF-8">

<cfset directory = "D:/TEST_CF/">
<cfdirectory directory="#directory#" name="files" action="list" type="file">
<cfset filecount = #files.RecordCount#>
<cfset divisor = 3>
<cfset division = #filecount# / #divisor#>
<cfset remainder = #filecount# MOD #divisor#>
<cfset folders_to_create = Ceiling(#division#)>

<cfoutput>

    <cfif directoryExists(directory)>
        <cfdirectory action="list" directory="#directory#" name="directories" recurse="true" type="dir" />
        <cfloop query="directories">
            <cfdirectory action="delete" directory="#directory#/#directories.name#" recurse="yes">
        </cfloop>
    </cfif>

    <cfloop from="1" to="#folders_to_create#" index="i">
        <cfdirectory
          action="create"
          directory="#directory#newfolder#i#">
    </cfloop>

    <cfif folders_to_create EQ 1>
        #folders_to_create#&nbsp;folder created
    <cfelse>
        #folders_to_create#&nbsp;folders created
    </cfif>

</cfoutput>

</body>
</html>

person Community    schedule 07.04.2013    source источник
comment
Что вызывает у вас трудности - копирование файлов или выполнение троек?   -  person Dan Bracuk    schedule 07.04.2013
comment
@Dan Bracuk Часть, которая вызывает у меня проблемы, - это копия. Я изменил описанный выше процесс с помощью cfc. После создания папок все файлы (20) копируются в первую папку. Для cfm следуйте [pastebin.com/ugrjPJ7W], а для cfc следуйте [pastebin.com/yXinvtvr]   -  person    schedule 08.04.2013
comment
У меня сейчас нет точного синтаксиса, но внутри ваших папок для создания цикла, не могли бы вы сделать второй цикл, в котором вы копируете файлы с именем файла file [1] .filename, file [2] .filename и т. Д. Я мог бы опубликуйте образец кода завтра   -  person steve    schedule 08.04.2013


Ответы (1)


Как сказал Стив, вам нужен второй цикл или лучше функция для выполнения действия fileMove.

Примечание

  • Логика - это просто POC. Вы можете улучшить его.
  • Я пробовал этот код на CF10. Он должен работать нормально и в Open DB.

    <cfprocessingdirective pageencoding="UTF-8">
    
    <cfscript>
        oDirectoryPath      = "D:/test_cf/"; //original Directory path
        files               = DirectoryList(oDirectoryPath, false, 'name', '*.*');
        filecount           = Arraylen(files);
        filePerFolder       = 3;
        numfoldersToCreate  = Ceiling(filecount/filePerFolder);
    
        function moveFilesToThisDirectory(dir,index){
            var beginAt = 1;
            var endAt   = begin + 2;
            var newDir  = ARGUMENTS.dir;
    
            beginAt = ARGUMENTS.index;
    
            if(beginAt neq 1){
                endAt = index * VARIABLES.filePerFolder;
                beginAt = endAt - (VARIABLES.filePerFolder - 1);
                if(endAt GT VARIABLES.fileCount){
                    endAt = VARIABLES.fileCount;
                }
            }
    
            while(beginAt LTE endAt){
                FileMove(oDirectoryPath & '\' & files[beginAt], newDir & '\' & files[beginAt]);
                beginAt = beginAt + 1;
            }
    
        }
    </cfscript>
    
    <cfif directoryExists(oDirectoryPath)>        
            <cfdirectory action="list" directory="#oDirectoryPath#" name="directories" recurse="true" type="dir" />
            <cfloop query="directories">
                    <cfdirectory action="delete" directory="#oDirectoryPath#/#directories.name#" recurse="yes">
            </cfloop>
    </cfif>
    
    <cfscript>
    
        i = 1;
        while(i LTE numfoldersToCreate){
            newDirectoryName = "#oDirectoryPath#newfolder#i#";
            DirectoryCreate(newDirectoryName);
            moveFilesToThisDirectory(dir:newDirectoryName,index:i );
            i = i + 1;
        }
    
        switch(numfoldersToCreate){
            case 0:
                WriteOutput(' No folder created');
                break;
            case 1:
                WriteOutput(' 1 folder created');
                break;
            default:
                WriteOutput(numfoldersToCreate & ' folders created');
        }
    </cfscript>
    

person Sanjeev    schedule 08.04.2013
comment
Большое спасибо за то, что разобрались с моей проблемой. Что спросить, смогу ли я найти хорошую книгу по методам работы с массивами (или учебник) - person ; 08.04.2013
comment
Просто небольшое предложение. Вы можете использовать разные имена переменных, чтобы избежать путаницы, поскольку begin и end обычно имеют особое значение в большинстве языков. - person Leigh; 08.04.2013
comment
@Leigh хорошее предложение. Я изменю код, чтобы дальнейшие поисковые запросы были аккуратными. - person Sanjeev; 09.04.2013