如何使用groovy以递归方式检查文件是否存在并重命名(如果存在)?

时间:2012-11-02 11:08:51

标签: groovy

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

我编写了以下函数,但它给了我一个例外

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      
}

1 个答案:

答案 0 :(得分:2)

您正在尝试:

f = checkForExistenceAndRename(newFilePath,false)

fFile的位置。但是你的函数返回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
  }
}