2013-04-07 1 views
0

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

Блочный код

<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> 
+0

Что часть вызывающий трудности - копирование файлов или делать в threesies? –

+0

@ Dan Bracuk Часть, которая вызывает у меня проблему, является копией. Я изменил вышеупомянутый процесс, используя cfc. После создания папок все файлы (20) копируются в первую папку. Для cfm следуйте за [http://pastebin.com/ugrjPJ7W] и для cfc follow [http://pastebin.com/yXinvtvr] – anarchos78

+0

У меня нет точного синтаксиса прямо сейчас, но внутри ваших папок для создания цикла можно вы делаете второй цикл, в котором вы копируете файлы с файлом имени файла [1] .filename, file [2] .filename и т. д. Я мог бы отправить пример кода завтра – steve

ответ

1

Как сказал Стив, вам нужен цикл два или лучше функцию, чтобы сделать действие FileMove.

Примечание

  • Логика просто РОС. Вы можете улучшить его до лучшего.
  • Я пробовал этот код на 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> 
    

+0

Большое спасибо за то, что заглянули в мою проблему. Я, что спросить, могу ли я найти хорошую книгу в методах манипуляции массивами (или учебник) – anarchos78

+0

Просто небольшое предложение. Вы можете использовать разные имена переменных, чтобы избежать путаницы, поскольку «начало» и «конец» обычно имеют особое значение на большинстве языков. – Leigh

+0

@ Очень хорошее предложение. Я изменю код, чтобы дальнейшие ссылки на поиск были аккуратными. – Sanjeev