我正在从 SFTP 从两个不同的目录下载文件,稍后将上传
Google 云端硬盘中的文件夹。
List<String> subDirs = Arrays.asList("Subdir1/fo1","Subdir2/fo2);
for (String remoteSubDir : subDirs) {
String remoteDir = sftpath + "/" + remoteSubDir;
String localDir = localPath;
sftpChannel.cd(remoteDir);
Vector<ChannelSftp.LsEntry> files = sftpChannel.ls("*.pdf");
for (ChannelSftp.LsEntry file : files) {
if (!file.getAttrs().isDir()) {
String remoteFile = remoteDir + "/" + file.getFilename();
String localFile = localDir + "/" + file.getFilename();
String filename = file.getFilename();
System.out.println("\n"+ remoteFile);
try {
sftpChannel.get(remoteFile, localFile);
System.out.println("Downloaded: " + filename);}
}.catch (SftpException e) {
e.printStackTrace();
System.out.println(e.getMessage() + "Error ");
}}}
像这样运行它会从服务器下载所有文件,问题是我希望它只下载驱动器文件夹中还没有的文件。 为此,我创建了一个方法来检查文件是否在 Google Drive 文件夹中,并将其放入程序中:
try {
boolean existFiles;
existFiles = checkFilesDrive(drive, parentFolderId, file.getFilename()); //check the files in google drive
if (!existFiles) {
System.out.println("+ remoteFile);
sftpChannel.get(remoteFile, localFile);
System.out.println("Downloaded: " + filename);
}
}catch (SftpException e) {
e.printStackTrace();
System.out.println(e.getMessage() + "Error ");
}
当我运行它时,它遍历所有文件,当它到达尚未在驱动器中的文件时,它会触发捕获并向我抛出错误:
Caused by: java.io.IOException: Pipe closed
at java.io.PipedInputStream.read(PipedInputStream.java:307)
at java.io.PipedInputStream.read(PipedInputStream.java:377)
at com.jcraft.jsch.ChannelSftp.fill(ChannelSftp.java:2909)
at com.jcraft.jsch.ChannelSftp.header(ChannelSftp.java:2935)
at com.jcraft.jsch.ChannelSftp._stat(ChannelSftp.java:2216)
... 5 more
丢失的文件不下载,一直遍历目录完成,没有切换到第二个目录。我只是得到一个错误。
我的代码有什么问题?与驱动器的连接是否正确,执行先检查驱动器文件夹的方法是否正确?它也不会切换到第二个目录。在添加检查驱动器文件夹的方法之前,一切都可以正常下载。
这就是我检查文件夹及其子文件夹中现有文件的方式:
FileList files = drive.files().list()
.setQ("'" + folderId + "' in parents and trashed = false and (name = '" + fileName + "' or fullText contains '" + fileName + "')")
.execute();
if (!files.getFiles().isEmpty()) {
return true;
}
String pageToken = null;
do {
FileList subFolders = drive.files().list()
.setQ("mimeType='application/vnd.google-apps.folder' and trashed = false and '" + folderId + "' in parents")
.setSpaces("drive")
.setFields("nextPageToken, files(id, name)")
.setPageToken(pageToken)
.execute();
for (File subFolder : subFolders.getFiles()) {
if (checkIfFileExistsInFolder(drive, subFolder.getId(), fileName)) {
return true;
}
}
pageToken = subFolders.getNextPageToken();
} while (pageToken != null);
return false;
}