【问题标题】:List files on FTPServer recursively递归列出 FTPServer 上的文件
【发布时间】:2014-05-19 08:28:11
【问题描述】:

我希望我的应用程序列出我的 FTP 服务器上的所有目录和文件。这是来自How to list ftp directories with android?的代码:

FTPFile[] files = null;
files = ftpClient.listDirectories();
String path = null;

    for (int i = 0; i < files.length; i++) {
       path = files[0].getName();
       Log.d("CONNECT", "Directories: "+ files[i].getName());
    }

    FTPFile[] files2 = ftpClient.listFiles(topPath);
    for (int j = 0; j < files2.length; j++) {
    Log.d("CONNECT", "Below " + files[j].getName()
                            + " is " + files2[j].getName());
    }

}

现在这仅适用于前两层。我怎样才能设法尽可能深入,以便我可以列出文件夹中的文件夹中的文件等等?

提前致谢:)

现在我尝试(不完全)递归:

{ ...
FTPFile[] files = ftpClient.listFiles();
listContent(files);
.... }
private void listContent(FTPFile[] file) throws IOException {

        FTPFile[] list = ftpClient.listDirectories();
        if (list != null) {
            for (FTPFile f : list) {
                if (f.isDirectory()) {
                    Log.d(TAG, "directory: " + f.getName());
                } else {
                    Log.d(TAG, "file: " + f.getName());
                }
            }
            listContent(list);
        } else return;

    }

这段代码让我只获得第一层目录,FTPFile[] 在新的循环中被覆盖。 我怎样才能做到这一点?

更新: 这是我的解决方案。此代码遍历主机地址的全部内容。感谢所有帮助过我的人:

private void listContent(String s) throws IOException {

        try {
            FTPFile[] ftpFiles = ftpClient.listFiles(s);
            int length = ftpFiles.length;

            for (int i = 0; i < length; i++) {
                String name = ftpFiles[i].getName();
                boolean isFile = ftpFiles[i].isFile();

                if (isFile) {
                    Log.i(TAG, "File : " + name);
                    }

                } else {
                    Log.i(TAG, "Directory : " + name);

                    if (ftpChangeDirectory(name) == true) {
                        Log.d("ftpChangeDirectory", name);
                        String newDir = ftpGetCurrentWorkingDirectory();
                        Log.d(TAG, "new Dir: " + newDir);
                        listContent(newDir);
                    }
                }
            }
            ftpChangeDirectory("..");
            String test = ftpGetCurrentWorkingDirectory();
            Log.d("dirUp", test);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

【问题讨论】:

  • 那你必须让它递归。
  • 当然,但是如何... 编辑:抱歉,忘记发布我的递归代码...等一下

标签: android list file ftp


【解决方案1】:

我无法测试它,但这样的东西应该可以工作:

private void listAllFiles(String path) // path is the top folder to start the search
{
    FTPFile[] files = ftpClient.listFiles(path); // Search all the files in the current directory
    for (int j = 0; j < files.length; j++) {
        Log.d("CONNECT", "Files: " + files[j].getName()); // Print the name of each files
    }

    FTPFile[] directories = ftpClient.listDirectories(path); // Search all the directories in the current directory

    for (int i = 0; i < directories.length; i++) {
        String dirPath = directories[i].getName();
        Log.d("CONNECT", "Directories: "+ dirPath); // Print the path of a sub-directory

        listAllFiles(dirPath); // Call recursively the method to display the files in the sub-directory
    }
}

无论如何,我强烈建议您了解代码并查看此link 以了解有关递归的更多信息。

【讨论】:

  • 问题是您只能通过提交字符串来访问 FTP 服务器的顶层文件夹。要获取下面的所有数据,您必须遍历 FTPFile[]。这就是我的问题。我只是找不到一种方法来做到这一点,而不用每次递归覆盖 FTPFile[] 。无论如何谢谢:)
  • 嗯,我不明白这里的问题。从documentation 我看不出为什么它不起作用。你试过我的代码吗?什么错误?
  • 程序没有填充 FTPFile[] 文件。它在 FTPFile[] files = ftpClient.listFiles(path) 之后离开该方法。问题可能是我需要登录服务器(连接时我当然会做什么)? (无论如何,像“userID:password@anyadress”这样的路径在作为参数提交时无法解析。)
  • 查看link 了解如何连接到 FTP 服务器。你可以用这样的路径调用我的方法:listAllFiles("path/folder").
  • 感谢您的链接,这就是解决方案。 “ftpChangeDirectory(String directory_path)”方法是关键! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 2013-05-07
  • 2018-05-14
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多