• Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

FTP problem in commons.net.ftp.FTPClient

 
Jerry Kreps
Greenhorn
Posts: 12
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hi, Everybody!
Listed below is a method I have written that is designed to connect to my remote FTP server, change the working directory on the FTP server to to a certain subdirectory (ftpSrcPath) that contains files that I want to FTP to my local directory (targetPath). I want to get an array of FTPFiles and FTP only those whose names do not start with "x_" (previously sent files). The variables loginSuccess, rootDir, cwdSuccess, and workingDir are there only so that I can see their values when I am debugging in my IDE.
When I run it through my debugger, I make the connection successfully (loginSuccess = true), my initial working directory on the remote FTP server is the root directory (rootDir = "/"), then I change the working directory successfully (cwdSuccess = true) and I can see the new working directory on the remote FTP server (workingDir = "/srcdir"). But when I try to get the array of FTPFile objects, the FTPClient.listFiles() method returns null.
What am I doing wrong? My initial suspicion is that the DefaultFTPFileListParser is not handling the names of the files in my source directory and that I need to make my own FTPFileListParser. But how? I've been able to find very little documentation on the web other than the API JavaDocs, and they don't say much about it.
Thanks in advance for your help!
Here's the code:
private void ftpFileTransfer()
throws DwhGenericException
{
try
{
FTPClient ftpClient = new FTPClient();
ftpClient.connect("99.999.9.999");
boolean loginSuccess = ftpClient.login(
"user",
"password");
String rootDir = ftpClient.printWorkingDirectory();
boolean cwdSuccess = ftpClient.changeWorkingDirectory(ftpSrcPath);
String workingDir = ftpClient.printWorkingDirectory();
// **** The following operation returns null. ****
FTPFile[] ftpFiles = ftpClient.listFiles();
for (int i = 0; i < ftpFiles.length; i++)
{
String fileName = ftpFiles[i].getName();
if (fileName.startsWith("x_"))
{
continue;
}
File newFile = new File(targetPath + "\\" + fileName);
FileOutputStream fos = new FileOutputStream (newFile);
ftpClient.retrieveFile(fileName,fos);
fos.close();
ftpClient.rename(fileName, "x_" + fileName);
}
ftpClient.logout();
ftpClient.disconnect();
ftpClient = null;
}
catch (Exception e)
{
JobLog.storeError(
"Error - ftpFileTransfer()",
e);
throw new DwhGenericException();
}
}
 
Jerry Kreps
Greenhorn
Posts: 12
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
As a PS to the above message:
I've put this message on the "Other Open Source APIs" forum, since I thought it might apply to that too. If this violates forum rules, I apologize and I will be more careful where to put my messages in the future.
 
Jerry Kreps
Greenhorn
Posts: 12
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Well, I found my own work-around that gets the job done.
My code in the original message used the FTPClient.listFiles() method to retrieve the array of FTPFile objects and then looped through the array using the getName() method of each object to pass the file name to the FTPClient.retrieveFile() method. But the trouble was that the FTPClient.listFiles() method always returned null even though the working directory clearly contained files that I wanted to download.
So I decided to go through the back door.
I noticed that the FTPClient.listNames() method returned an array of string objects that were the names of all the files in the source directory that I wanted to download. So then just I looped through the string array and I passed each file name string to the FTPClient.retrieveFile() method and it worked like a charm.
The only question is: Why did the FTPClient.listFiles() method always return null when the FTPClient.listNames() method was able to identify the files I wanted?
Well, I hope this helps someone else who comes across the same problem. If any of you know that answer to my puzzle, please fill me in. Thanks!
I LOVE JavaRanch!!!
 
Melissa Pellegrin
Greenhorn
Posts: 4
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I have been doing quite a bit of work with the FTPClient software. I am finding that different versions of the FTP software can result in different outcomes.
A majority of the time, when I use listFiles (), I would put the full path in the "()". For example, ftp.listFiles (/root/dir1/*.txt), and I would get back a list of all *.txt files.
 
Rick Herrick
Greenhorn
Posts: 11
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I just ran across this while looking for info on using the Commons FTP package. You may want to try setting your connection to passive. A lot of the issues that people have had getting info properly through the FTP connection have related to firewall issues, which can be (somewhat) circumvented by using a passive instead of active FTP connection.
 
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic