2

如果文件已经存在,如何通过附加一些递增的数字递归检查和重命名文件?

我写了下面的函数,但它给了我一个例外

org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'E:\Projects\repo1\in_conv1.xml' with class 'java.lang.String' to class 'java.io.File'

代码

//newFilePath = E:\Projects\repo1\old\testcustprops.xml
String newFilePath = checkForExistenceAndRename(newFilePath,false)

private String checkForExistenceAndRename(String newFilePath, boolean flag){
    File f = new File(newFilePath)
    if(!flag){
        if(f.exists()){
            //renaming file
            newFilePath=newFilePath[0..-5]+"_conv${rename_count++}.xml"
            f = checkForExistenceAndRename(newFilePath,false)
        }
        else 
            f = checkForExistenceAndRename(newFilePath,true)
    }
    else
        return newFilePath      
}
4

1 回答 1

3

您正在尝试执行以下操作:

f = checkForExistenceAndRename(newFilePath,false)

f一个在哪里File。但是你的函数返回一个String

不确定它是否有效(我尚未测试您的功能),但您可以尝试:

private String checkForExistenceAndRename(String newFilePath, boolean flag){
    File f = new File(newFilePath)
    if(!flag){
        if(f.exists()){
            //renaming file
            newFilePath = newFilePath[0..-5]+"_conv${rename_count++}.xml"
            newFilePath = checkForExistenceAndRename(newFilePath,false)
        }
        else 
            newFilePath = checkForExistenceAndRename(newFilePath,true)
    }
    return newFilePath      
}

此外,没有必要使用递归......

为什么不这样做:

private String getUniqueName( String filename ) {
  new File( filename ).with { f ->
    int count = 1
    while( f.exists() ) {
      f = new File( "${filename[ 0..-5 ]}_conv${count++}.xml" )
    }
    f.absolutePath
  }
}
于 2012-11-02T11:12:36.743 回答