1

我正在尝试遍历服务器上的文件夹以获取特定文件的列表,然后将这些文件复制到临时目录或压缩并复制到临时目录。但是我一直在碰壁,因为我不知道该怎么做。(仍然是 ColdFusion 的业余爱好者)

所以在这里我做了一个 SQL 查询,我从我正在寻找的特定日期检索确切的附件:

<cfquery name="test" datasource="test" cachedwithin="#CreateTimeSpan(0,0,10,0)#" result="r">
SELECT Test.TestNum, Test1.Test1Date, TestReport.Attachment
FROM Test
INNER JOIN more SQL code here..
WHERE Test1.Test1Date >= '#daterangevariablehere#'
AND NOT more SQL code here as well..
ORDER BY Test.TestNum
</cfquery>

SQL 查询在 SQL Server Mgmt Studio 中是正确的,它可以正确执行,甚至在我尝试执行 cfdump 之前它显示了我尝试获取的正确文件列表。但是,当我尝试遍历它们以复制或压缩它们时,这完全失败-> 空白页。

我尝试过了:

<cfloop query="test">
<cfif test.recordcount gt 0>
<cfzip action="zip" file="#LocationOfwhereIwantTheEndResult" source="#WhereTheFolderWithTheAttachmentsReside#">
</cfzip>
</cfloop>

我什至尝试这样做,围绕上面的代码:

<cfdirectory action="list" name="test" directory="#WhereTheFolderWithTheAttachmentsReside#"></cfdirectory>

旁注:一些变量和代码是为了安全和匿名而组成的..但我想展示我正在尝试完成的结构我希望我很清楚(!)如果否则请让我知道,我会提供更多细节或信息。非常感谢任何帮助,我一直在用头撞墙,觉得这可能是超级简单的事情。请帮忙!:)

4

2 回答 2

2

在不知道实际值的情况下,听起来您的查询包含单个文件的绝对路径。一种选择是循环查询并为每个文件添加一个cfzipparam。这是一个独立的例子,你可以适应。(它使用 CFML,因为这就是您的示例中的内容,但如果您对脚本语法感到满意,请在上面的链接中查找基于 cfscript 的版本)。

CFML 示例:

<!--- For Demo only to simulate your database query --->
<cfset test = queryNew("Attachment"
            , "varchar"
            , [{Attachment="c:\path\to\fileA.png"}
                , {Attachment="c:\path\to\fileB.png"}
                , {Attachment="c:\path\to\fileC.png"}
            ])>

<cfzip action="zip" file="c:\path\to\TheNameYouWant.zip">
    <cfloop query="test">
        <!--- If Attachment only contains a file name (i.e. "someFileName.pdf") 
           use your variables to build a full path, i.e. "c:\path\to\someFileName.pdf" 
         --->
        <cfzipparam source="#Attachment#">
    </cfloop>
</cfzip>

CFScript 示例

<cfscript>
   test = queryNew("Attachment"
            , "varchar"
            , [{Attachment="c:\path\to\fileA.png"}
                , {Attachment="c:\path\to\fileB.png"}
                , {Attachment="c:\path\to\fileC.png"}
            ]);

    cfzip (action="zip", file="c:\path\to\TheNameYouWant.zip") {
        for (row in test) {
            cfzipparam (source=row.Attachment);
        }
    }
</cfscript>

简而言之,您不必发布实际路径。大多数时候,无论如何它都无关紧要;-)但是请发布代表实际路径的硬编码值 - 而不是变量。原因是变量留下了很多悬而未决的问题,可以通过使用类似c:\path\to\fileA.pdf. 在这种特定情况下,了解诸如您的操作系统之类的信息,无论源是文件/目录还是相对/绝对路径,将有助于我们立即排除几个潜在问题。

于 2019-02-05T18:15:46.730 回答
0
<cfif test.recordcount>
  <cfloop query="test">
    <cfzip action="zip" file="#LocationOfwhereIwantTheEndResult#" source="#WhereTheFolderWithTheAttachmentsReside#">
    </cfzip>
  </cfloop>
</cfif>

我怀疑您的filesource位置不正确。使用ExpandPath()函数来确保它去正确的地方。

于 2019-02-05T17:25:44.503 回答