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
一些观察结果和糟糕的 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 根目录之外的传统文件系统,使用适当的锁定,可能是更好的选择。