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

Evi*_*mes 5 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>
Run Code Online (Sandbox Code Playgroud)

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

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">
Run Code Online (Sandbox Code Playgroud)

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

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

在此输入图像描述

EXTRA BOUNTY INFO~新增6/9/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">
Run Code Online (Sandbox Code Playgroud)

小智 0

一些观察结果和糟糕的 Adob​​e 文档:

使用LOCAL作用域可能没问题,但我不希望你这样做,因为代码不在函数内。

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

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

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