我有一个访问内存文件的页面。我们有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()函数显示没有什么可以阻止我访问目录。
下图显示了略有不同的路径。为简洁起见,路径不同。
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">
答案 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根目录之外的传统文件系统可能是更好的选择。