1

我使用以下代码生成了一系列文件:

<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(),但它的作用有点过早,我需要它确定文件是否完整......有什么想法可以解决这个问题吗?

4

3 回答 3

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>

于 2013-07-08T17:14:54.017 回答
2

你真的应该显示你的批处理代码。大概您的批处理脚本会生成具有特定名称或扩展名的文件,然后您稍后使用 FileExists() 来查找具有适当名称的文件是否存在以进行处理。

我怀疑最简单的解决方案是修改您的批处理脚本,使其首先创建一个具有无法识别的备用名称的文件。文件完成后,让您的批处理脚本使用 MOVE 将文件重命名为正确的名称。通过这种方式,您的 FileExists() 测试可以确保文件是完整的。

于 2013-07-08T14:05:33.473 回答
1

<cfexecute>timeout参数。只需将其设置为较高的数字即可。

可能需要增加整体请求超时。

<cfsetting requesttimeout="300">
于 2013-07-08T07:30:08.517 回答