2013-04-07 70 views
0

我已经被要求解决以下问题:在新创建的文件夹中批量复制3个文件。例如:在文件夹中,让我们说“D:/ TEST_CF /”有20个txt文件。将它们除以3(批次 - 给我们6剩余2),创建7个文件夹(以便将3个批次放置在6个文件夹中,其余2个文件放置在第7个文件夹中)。我到现在为止所做的是创建所需的文件夹。但是,我无法将文件复制到新建文件夹中的3个批次中。我应该如何解决上述问题?使用ColdFusion复制文件夹中的文件(openBD引擎)

代码块

<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? – 2013-04-07 16:35:15

+0

@Dan Bracuk导致我问题的部分是复制。我已经使用cfc改变了上述过程。创建文件夹后,所有文件(20)都将复制到第一个文件夹中。对于cfm遵循[http://pastebin.com/ugrjPJ7W]和cfc遵循[http://pastebin.com/yXinvtvr] – anarchos78 2013-04-07 20:10:10

+0

我现在没有确切的syntac,但在您的文件夹内创建循环,可以你做一个第二循环,你用文件名文件[1] .filename,file [2] .filename等复制文件...我可以在明天发布一个示例代码 – steve 2013-04-08 02:53:36

回答

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> 
    

+0

非常感谢您检查我的问题。我该问什么,如果我可以在数组操作技术(或教程)中找到一本好书 – anarchos78 2013-04-08 17:02:11

+0

只是一个小小的建议。您可能希望使用不同的变量名称以避免混淆,因为'begin'和'end'在大多数语言中通常具有特殊含义。 – Leigh 2013-04-08 19:16:37

+0

@很好的建议。我将修改代码,以便进一步的搜索引用将整齐。 – Sanjeev 2013-04-09 02:20:06

相关问题