为什么directoryExists测试为true但cfdirectory失败?

时间:2014-05-27 14:54:19

标签: coldfusion coldfusion-10

我有一个访问内存文件的页面。我们有10到20万个文件存储在数百个目录中(最多2000个)。所有目录和文件都是以编程方式创建的。没有设置或更改权限。所有文件都使用默认的CF帐户,我们没有遇到任何问题。

每隔一段时间,我们就会收到一个错误。我们测试目录的存在。如果它存在,我们获取目录的内容并对文件执行某些操作。无论是否有内容,我们都能成功读取目录。

<cfscript>
    LOCAL.RamFileDir = "ram://CatSearchMenu/9160";
</cfscript>

<cfoutput>
<cfif directoryExists("#LOCAL.RamFileDir#") eq true>
    #LOCAL.RamFileDir# exists<br>
    <cfdirectory name="getRamFiles" directory="#LOCAL.RamFileDir#" action="list">
    <cfdump var="#getRamFiles#">
<cfelse>
    #LOCAL.RamFileDir# DOES NOT exist<br>
</cfif>     
</cfoutput>

这是我得到的错误......

An error occurred when performing a file operation listFiles on file /CatSearchMenuSubCats/9160.

The cause of this exception was: org.apache.commons.vfs2.FileSystemException: Could not list the contents of folder "ram:///CatSearchMenuSubCats/9160"..

The error occurred in E:/INETPUB/WWWROOT/AVCATALOGS/...: line 92

 91 :                   <!--- GET THE FILES --->
 92 :                   <cfdirectory name="getRamFiles" 
 93 :                       directory="#LOCAL.RamFileDir#" 
 94 :                       action="list">

getFileInfo()函数显示没有什么可以阻止我访问目录。

下图显示了略有不同的路径。为简洁起见,路径不同。

enter image description here

EXTRA BOUNTY INFO~14 / 6/2014

这个特定的目录通过了directoryExists()测试,但是当我们使用cfdirectory列出内容时,它会窒息。怎么能通过一次测试再失败?

我们无法对此目录执行任何cfdirectory操作,任何创建,删除或列表操作都不起作用。但是,如果我们知道文件的名称,我们就可以访问目录中的文件。

当我们重新启动ColdFusion服务时,ram被清除了。自动地,另一个进程根据需要创建文件。这些文件可以启动并运行,并且可以连续几天正常运行。然后,突然间,只有一个目录不可用。它永远不是同一个目录。几天后,ONE MORE目录变得不可用。同样,每个其他目录(两千个)完美地运作。同样,任何目录中的所有文件都可以完全访问。一旦目录变得不可用,它将保持这种状态,直到我们重新启动ColdFusion服务。

<cfscript>
// SET RAM FILE BASE
LOCAL.RamFileBase = "ram://includes";
</cfscript>

<!--- TEST THE BASE --->
<cfoutput>
<cfif directoryExists("#LOCAL.RamFileBase#") eq true>
<h1>#LOCAL.RamFileBase# BASE EXISTS</h1>

<!--- GET THE BASE --->
<cfdirectory name="getRamBase" directory="#LOCAL.RamFileBase#" action="list">

<!--- LOOP THROUGH THE BASE --->        
<cfloop query="getRamBase">

    <!--- TEST THE SUB DIRECTORY --->
    <cfif directoryExists("#LOCAL.RamFileBase#/#getRamBase.Name#") eq true>
        <h3>#LOCAL.RamFileBase#/#getRamBase.Name# SUB DIR EXISTS</h3>

        <!--- GET THE SUB DIRECTORY --->
        <cfdirectory name="getRamSubDir" directory="#LOCAL.RamFileBase#/#getRamBase.Name#" action="list">

        <!--- LOOP THROUGH THE SUB DIRECTORY --->
        <cfloop query="getRamSubDir">

            <!--- TEST THE SUB SUB DIRECTORY ~ WHERE THE FILES ARE --->
            <cfif directoryExists("#LOCAL.RamFileBase#/#getRamBase.Name#/#getRamSubDir.Name#") eq true>
                <b>#LOCAL.RamFileBase#/#getRamBase.Name#/#getRamSubDir.Name#</b> SUB SUB DIR EXISTS<br>

                <!--- GET THE FILES IN THE SUB SUB DIRECTORY --->
                                    <!--- THIS IS WHERE THE PROBLEM IS --->
                <cfdirectory name="getRamFiles" 
                        directory="#LOCAL.RamFileBase#/#getRamBase.Name#/#getRamSubDir.Name#" 
                        action="list" 
                        sort="DateLastModified ASC">

                    <!--- LOOP THROUGH THE FILES --->
                    <cfloop query="getRamFiles">

1 个答案:

答案 0 :(得分:0)

一些观察结果和糟糕的Adobe文档:

使用LOCAL范围可能没问题但是我不喜欢你,因为代码不在函数中。

在浏览Adobe文档时,我注意到在引用内存文件时经常使用3个正斜杠。例如:ram:///不使用3可能是一个微妙的问题。

根据http://help.adobe.com/en_US/ColdFusion/10.0/Developing/WSe9cbe5cf462523a0-70e2363b121825b20e7-8000.html<cfdirectory />标记未出现在“内存文件支持以下标记:”部分。这是令人不安的,因为在同一页面上的该部分上方的示例使用<cfdirectory />

最后,我不相信内存功能是为了处理存储在数百个目录中的10-20k文件。 :)使用正确锁定的Web根目录之外的传统文件系统可能是更好的选择。