File 表达式';目的地';类型为';文件';不能作为函数调用

File 表达式';目的地';类型为';文件';不能作为函数调用,file,kotlin,copy,File,Kotlin,Copy,我试图构建一个函数,它将所有文件从某个目录复制到一个新目录,如果它们的扩展名与我传递给该函数的扩展名匹配,并且它们不是空的 我一直收到这样的错误表达式'destination'类型'File'不能作为函数调用。未找到函数“invoke()” 我对如何处理这个问题有点困惑,因为文件可以是文件,也可以是目录,对吗?在我的例子中,我将一个目录传递给该函数,那么如何将所需文件复制到该目录中的新文件中呢?我不熟悉处理文件 这是我到目前为止的代码(我只想返回复制的文件数量) 当您将括号放在变量名后面时(就像

我试图构建一个函数,它将所有文件从某个目录复制到一个新目录,如果它们的扩展名与我传递给该函数的扩展名匹配,并且它们不是空的

我一直收到这样的错误
表达式'destination'类型'File'不能作为函数调用。未找到函数“invoke()”

我对如何处理这个问题有点困惑,因为
文件
可以是文件,也可以是目录,对吗?在我的例子中,我将一个目录传递给该函数,那么如何将所需文件复制到该目录中的新文件中呢?我不熟悉处理文件

这是我到目前为止的代码(我只想返回复制的文件数量)


当您将括号放在变量名后面时(就像您在
目标(copiedFiles.toString())
中所做的那样),编译器认为您试图像调用函数一样调用
目标
对象。换句话说,它尝试调用应该存在于任何对象中的
invoke
方法(您可以阅读该方法),该对象像函数一样被调用。显然,
File
类没有它

也许,你错过了一些方法调用?类似于
目的地。
克隆
(copiedFiles.toString())
(我不知道您在这里真正需要什么方法)

fun copyFiles(source: File, destination: File, fileExtension: String = ""): Int {

    var copiedFiles =0;
    if(!source.isDirectory() || !destination.isDirectory() return 0

    source.walk().forEach {file->
        if(file.length().toInt() == 0) return@forEach

        if(fileExtension !="" &&  file.extension !=  fileExtension) return@forEach

        file.copyTo(destination(copiedFiles.toString()))
        copiedFiles++
    }


    return copiedFiles
}