Копирование файлов в папки с использованием 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# folder created
<cfelse>
#folders_to_create# folders created
</cfif>
</cfoutput>
</body>
</html>
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>