gpt4 book ai didi

java - 用 Java 下载整个 FTP 目录 (Apache Net Commons)

转载 作者:行者123 更新时间:2023-12-01 04:54:12 24 4
gpt4 key购买 nike

我正在尝试递归地遍历登录 FTP 服务器后到达的整个根目录。

我能够连接,我真正想做的就是递归整个结构,下载每个文件和文件夹,并使其结构与 FTP 上的结构相同。到目前为止,我拥有的是一种有效的下载方法,它会发送到服务器并获取我的整个文件结构,这非常出色,除了第一次尝试时失败,然后第二次尝试时可以正常工作。我得到的错误如下:

java.io.FileNotFoundException: output-directory\test\testFile.png (The system cannot find the path specified)

我设法实现了本地目录的上传功能,但无法完全下载工作,经过多次尝试后我确实需要一些帮助。

public static void download(String filename, String base)
{
File basedir = new File(base);
basedir.mkdirs();

try
{
FTPFile[] ftpFiles = ftpClient.listFiles();
for (FTPFile file : ftpFiles)
{
if (!file.getName().equals(".") && !file.getName().equals("..")) {
// If Dealing with a directory, change to it and call the function again
if (file.isDirectory())
{
// Change working Directory to this directory.
ftpClient.changeWorkingDirectory(file.getName());
// Recursive call to this method.
download(ftpClient.printWorkingDirectory(), base);

// Create the directory locally - in the right place
File newDir = new File (base + "/" + ftpClient.printWorkingDirectory());
newDir.mkdirs();

// Come back out to the parent level.
ftpClient.changeToParentDirectory();
}
else
{
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
String remoteFile1 = ftpClient.printWorkingDirectory() + "/" + file.getName();
File downloadFile1 = new File(base + "/" + ftpClient.printWorkingDirectory() + "/" + file.getName());
OutputStream outputStream1 = new BufferedOutputStream(new FileOutputStream(downloadFile1));
boolean success = ftpClient.retrieveFile(remoteFile1, outputStream1);
outputStream1.close();
}
}
}
}
catch(IOException ex)
{
System.out.println(ex);
}
}

最佳答案

你的问题(嗯,在我们摆脱了 ... 并且你解决了二进制问题之后你当前的问题)是你正在做递归调用 newDir.mkdirs() 之前的步骤。

假设你有一棵像这样的树

.
..
someDir
.
..
someFile.txt
someOtherDir
.
..
someOtherFile.png

你要做的就是跳过点文件,看到someDir是一个目录,然后立即进入它,跳过它的点文件,然后看到someFile.txt,并处理它。您尚未在本地创建 someDir,因此您会收到异常。

您的异常处理程序不会停止执行,因此控制权会返回到递归的上层。此时它创建了目录。

因此,下次运行程序时,本地 someDir 目录已在上次运行中创建,因此您不会发现任何问题。

基本上,您应该将代码更改为:

            if (file.isDirectory())
{
// Change working Directory to this directory.
ftpClient.changeWorkingDirectory(file.getName());

// Create the directory locally - in the right place
File newDir = new File (base + "/" + ftpClient.printWorkingDirectory());
newDir.mkdirs();

// Recursive call to this method.
download(ftpClient.printWorkingDirectory(), base);

// Come back out to the parent level.
ftpClient.changeToParentDirectory();
}

关于java - 用 Java 下载整个 FTP 目录 (Apache Net Commons),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14434204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com