重命名 ftp 文件夹 Java 中的文件时出错

Error while Rename file in ftp folder Java

以下是我读取文件并在之后重命名的代码。我正在使用 apache commons.net 3.0.1.

client.connect(localhost);
boolean login = client.login("username", "password");
if(login){
    System.out.println("login successful");
    boolean chdir = client.changeWorkingDirectory("/home/folder1/child/");
    String url = client.printWorkingDirectory();   // EDIT
    FTPFile[] result = client.listFiles(url, filter);
    if (result != null && result.length > 0) {
        for (FTPFile aFile : result) {
            try{
                String filename = aFile.getName();
                InputStream is= client.retrieveFileStream(filename);
                br = new BufferedReader(new InputStreamReader(is));
                    while((line = br.readLine()) != null){
                        System.out.println("the line is"+line);
                     }
                }
                finally{
                    if(br!=null){
                        try{
                           br.close();
                           String oldFilename =url + "/" +aFile.getName();
                           String newFilename = "PRO"+aFile.getName();
                           boolean rename = client.rename(oldFilename, newFilename);
                            if(rename){
                                    System.out.println("renamed");
                            }   
                           else{
                                    System.out.println("Error in renaming");
                                }

                          }

文件未重命名且程序打印

error in renaming files (cz boolean rename = false).

我参考了不同的例子。但似乎都显示出同样的问题。 过滤后选择文件并读取,没有任何问题。

如果有人能指出我在这里做错了什么,那将非常有帮助。

这里的urlString url = client.printWorkingDirectory();

相对路径和绝对路径我都试过了。并且只给出 oldFilename 的完整路径,只给出 newFilename 的文件名。两者均无效。

编辑

在更改目录之前,url 将是 /,即根目录。 更改目录后,url 将变为 /home/folder1/child/。这是文件所在的位置。

InputStream retrieveFileStream(String remote):这个方法return是一个InputStream,我们可以用它从远程文件中读取字节。这种方法使我们能够更好地控制如何读取和写入数据。但是使用这个方法有两个要点:

之后必须调用方法 completePendingCommand() 以完成文件传输并检查其 return 值以验证下载是否确实成功完成。

boolean success = ftpclient.completePendingCommand();
if (success){
        System.out.println("File #2 has been downloaded successfully.");
 }

我们必须显式关闭 InputStream。

is.close(); //is = InputStream

SOURCE