我使用以下代码生成了一系列文件:
<cfloop list="#clients#" index="idx">
<cfexecute name="c:\windows\system32\cmd.exe" arguments='/c #APPLICATION.basepath#scripts\foldersize\dirP.bat #idx#'/>
<cfexecute name="c:\windows\system32\cmd.exe" arguments='/c #APPLICATION.basepath#scripts\foldersize\dirA.bat #idx#'/>
</cfloop>
这会触发许多列出这些目录的请求,并同时将findstr
过滤器传递给相应的文件......
我需要的是确保文件完全创建的方法,然后再使用CFFILE
来读取输出...
我使用的是FileExists()
,但是它过早地起作用了,我需要确定该文件是完整的......任何想法如何解决这个问题?
答案 0 :(得分:4)
设置高超时实际上并不验证文件写入完成。它只允许代码运行更长时间。此外,只是能够读取文件并不意味着它也被写入。您需要做的是查看文件大小以进行更改。但是在获取文件信息时必须小心不要导致阻塞情况。尝试在不创建非阻塞读取的情况下读取文件可能会中断文件写入并导致文件失败。这可以使用以下代码完成。
给定一个文件,代码将一直运行,直到文件被写入并且没有被锁定。这段代码已有几年了,但您应该明白这一点。
<cffunction name="isFileWritten" access="public" returntype="string">
<cfargument name="source" type="struct" required="yes"/>
<cfscript>
thisFile = source;
fileRead = createObject("java", "java.io.FileInputStream");
thisThread = CreateObject("java", "java.lang.Thread");
loopCT = 1;
while(1 EQ 1)
{
try
{
fileRead.init(thisFile);
break;
}
catch(any ecpt)
{
thisThread.sleep(1000);
}
incrementValue(loopCT);
if(loopCT GT 60)
{
fileRead.close();
return;
}
}
loopCT = 1;
while(1 EQ 1)
{
sizeA = fileRead.available();
thisThread.sleep(1000);
sizeB = fileRead.available();
if(sizeA EQ sizeB)
{
thisThread.sleep(1000);
sizeC = fileRead.available();
if(sizeC EQ sizeB)
{
break;
}
}
incrementValue(loopCT);
if(loopCT GT 60)
{
fileRead.close();
return;
}
}
fileRead.close();
</cfscript>
<cfreturn>
答案 1 :(得分:2)
你真的应该展示你的批次代码。据推测,您的批处理脚本会生成具有特定名称或扩展名的文件,然后您可以使用FileExists()查找是否存在具有相应名称的文件来处理。
我怀疑最简单的解决方案是修改批处理脚本,使其首先创建一个具有无法识别的备用名称的文件。文件完成后,让批处理脚本使用MOVE将文件重命名为正确的名称。通过这种方式,您的FileExists()测试可以确保文件已完成。
答案 2 :(得分:1)