Validation ColdFusion CFFILE rename属性验证错误,属性源的值无效,即使文件存在且路径正确

Validation ColdFusion CFFILE rename属性验证错误,属性源的值无效,即使文件存在且路径正确,validation,coldfusion,rename,cffile,attribution,Validation,Coldfusion,Rename,Cffile,Attribution,我想为这个问题找到解决办法,真是疯了 代码如下: <!--- Rename PNG File to remove _page_1.png ---> <cfset fileOnServer = "#RootDirectory#\calendar\#uploadedImage#"> <cfif FileExists("#fileOnServer#")> FileExists<br> <cfset test = GetFileInfo("#

我想为这个问题找到解决办法,真是疯了

代码如下:

<!--- Rename PNG File to remove _page_1.png --->
<cfset fileOnServer = "#RootDirectory#\calendar\#uploadedImage#">
<cfif FileExists("#fileOnServer#")>
  FileExists<br>
  <cfset test = GetFileInfo("#fileOnServer#")>
  <cfdump var="#test#">
  <cfset fileName = "#test.name#">
  <cfset newFileName = #Replace(fileName,'_page_1','')#>
  <cfset fullNewFilePath = "#RootDirectory#\calendar\#newFileName#">
  <cfoutput>fileName: #fileName#<br>newFileName: #newFileName#<br>fullNewFilePath: #fullNewFilePath#<br></cfoutput>
  <cftry>
    <cffile action="rename" destination="#fullNewFilePath#" source="#fileOnServer#" attributes="normal" nameconflict="overwrite">
    <cfcatch>
      <cfoutput>
        <div style="text-align: left;">
          Error occured....<br /><br />
          Message: <b>#cfcatch.Message#</b><br /> 
          Detail: <b>#cfcatch.Detail#</b><br />
          Type: <b>#cfcatch.Type#</b><br />
        </div>
      </cfoutput>
      <cfset ErrorOccurred = "Y">
    </cfcatch>
  </cftry>
</cfif>
我有另一个cffile action=“rename”在页面前面执行,没有问题。此外,如果在单独的页面上执行,则此代码将运行良好,而不是在此页面(我需要它运行的地方)

我的主机在Windows上运行ColdFusion 10,如果这有帮助的话

感谢所有能够帮助解决这个问题的人

~~珍妮弗~~

*更新以显示最终的效果:

<!--- Rename PNG File to remove _page_1.png --->
<cfset fileOnServer = "#RootDirectory#\calendar\#uploadedImage#">
<cfif FileExists("#fileOnServer#")>
    <cfset RETRY_COUNT_MAX=10>
    <cfset RETRY_SLEEP_MS=5000>
    <cfloop index="retryCount" from="1" to="#RETRY_COUNT_MAX#">
        <cftry>
        <!--- Trying to repeat this code until it works --->                    
        <cfset myFile = GetFileInfo("#fileOnServer#")>
        <cfset fileName = "#myFile.name#">
        <cfset newFileName = #Replace(fileName,'_page_1','')#>
        <cfset fullNewFilePath = "#RootDirectory#\calendar\#newFileName#">
        <cffile action="rename" destination="#fullNewFilePath#" source="#fileOnServer#" attributes="normal" nameconflict="overwrite">
        <cfbreak>
        <cfcatch>
            <cfif retryCount GTE RETRY_COUNT_MAX><cfrethrow></cfif>
            <cfthread action="sleep" duration="#RETRY_SLEEP_MS#" />
        </cfcatch>
        </cftry>
    </cfloop>
</cfif>

我知道有几种可能会误导错误的地方:

1) 在某些版本的CF中,存在一个错误,cffile报告源属性错误,而真正原因是目标属性错误-例如缺少目录或文件名冲突或缺少对目标的权限。听起来你已经排除了大部分的可能性

2) 在某些情况下,Coldfusion服务用户需要对源目录具有“修改”权限才能执行重命名操作,即使它已经具有读+执行+写操作,如果没有读+执行+写操作,则会产生这种神秘的消息。如果是这种情况,那么您应该能够通过将文件复制到不同的目录而不是在同一目录中重命名来证明这一点


3) 我以前见过由于服务器进程监视某些目录的更改而导致的文件句柄锁定问题,包括但不限于AV/恶意软件扫描仪、自动备份/robocopy脚本,以及将文件传播到群集中的其他节点。这可能导致在上传文件并释放锁后几秒钟内无法修改或重命名文件-如果是这种情况,并且服务器管理员不在您的控制范围内,那么您应该能够使用try/catch+循环重试n次,并在每次迭代时短暂等待-例如
sleep(5000)

我知道有几种可能会误导错误的地方:

1) 在某些版本的CF中,存在一个错误,cffile报告源属性错误,而真正原因是目标属性错误-例如缺少目录或文件名冲突或缺少对目标的权限。听起来你已经排除了大部分的可能性

2) 在某些情况下,Coldfusion服务用户需要对源目录具有“修改”权限才能执行重命名操作,即使它已经具有读+执行+写操作,如果没有读+执行+写操作,则会产生这种神秘的消息。如果是这种情况,那么您应该能够通过将文件复制到不同的目录而不是在同一目录中重命名来证明这一点


3) 我以前见过由于服务器进程监视某些目录的更改而导致的文件句柄锁定问题,包括但不限于AV/恶意软件扫描仪、自动备份/robocopy脚本,以及将文件传播到群集中的其他节点。这可能导致在上传文件并释放锁后几秒钟内无法修改或重命名文件-如果是这种情况,并且服务器管理员不在您的控制范围内,那么您应该能够使用try/catch+循环重试n次,并在每次迭代时短暂等待-例如
sleep(5000)

文件操作的错误消息在CF中通常会产生误导(Java中的广泛异常并不完全有帮助)。在尝试重命名/移动源文件时,很可能源文件仍处于锁定状态。或者目标文件已存在。或者磁盘已满。通过复制源文件而不是重命名/移动源文件来开始调试,然后看看会发生什么。如果你能把它缩小到一个文件锁,真正的乐趣就开始了。锁的原因是什么?打开的文件句柄?也许是另一条线?您可能希望在尝试重命名之前共享您运行的代码(源文件来自何处?)。请尝试使用cflock处理文件(读取/重命名)等的每一个代码。页面上还有其他代码吗?该代码是否恰好存在于循环或cfc中,其中可能存在其他冲突变量?由于可能会有有用的信息,请将cfcatch转储掉。我曾尝试使用cflock标记中包含的cffile标记运行代码,但得到了相同的错误。我尝试复制(而不是重命名)该文件——同样的错误。如果目标文件存在,我已启用覆盖,所以这不重要,对吗?另外,文件需要存在才能重命名,对吗?此代码不在循环或cfc中。我无法转储cfcatch,因为我的主机已禁用该功能。我认为文件锁可能是问题所在,但我真的不知道如何解决这个问题。我会继续努力…文件可能已损坏。可以在同一源路径中尝试其他文件吗?文件夹本身是否具有ColdFusion访问它的权限?在CF中,文件操作的错误消息通常会产生误导(Java中广泛的异常并不完全有帮助)。在尝试重命名/移动源文件时,很可能源文件仍处于锁定状态。或者目标文件已存在。或者磁盘已满。通过复制源文件而不是重命名/移动源文件来开始调试,然后看看会发生什么。如果你能把它缩小到一个文件锁,真正的乐趣就开始了。锁的原因是什么?打开的文件句柄?也许是另一条线?您可能希望在尝试重命名之前共享您运行的代码(源文件来自何处?)。请尝试使用cflock处理文件(读取/重命名)等的每一个代码。页面上还有其他代码吗?该代码是否恰好存在于循环或cfc中,其中可能存在其他冲突变量?排出氟氯化碳
<!--- Rename PNG File to remove _page_1.png --->
<cfset fileOnServer = "#RootDirectory#\calendar\#uploadedImage#">
<cfif FileExists("#fileOnServer#")>
    <cfset RETRY_COUNT_MAX=10>
    <cfset RETRY_SLEEP_MS=5000>
    <cfloop index="retryCount" from="1" to="#RETRY_COUNT_MAX#">
        <cftry>
        <!--- Trying to repeat this code until it works --->                    
        <cfset myFile = GetFileInfo("#fileOnServer#")>
        <cfset fileName = "#myFile.name#">
        <cfset newFileName = #Replace(fileName,'_page_1','')#>
        <cfset fullNewFilePath = "#RootDirectory#\calendar\#newFileName#">
        <cffile action="rename" destination="#fullNewFilePath#" source="#fileOnServer#" attributes="normal" nameconflict="overwrite">
        <cfbreak>
        <cfcatch>
            <cfif retryCount GTE RETRY_COUNT_MAX><cfrethrow></cfif>
            <cfthread action="sleep" duration="#RETRY_SLEEP_MS#" />
        </cfcatch>
        </cftry>
    </cfloop>
</cfif>