title: Apache Camel FTP getting Cannot retrieve file: RemoteFile error
body: <p>I'm trying to retrieve files using the Camel FTP component (Camel 2.19.0):</p>
  
  <pre><code>from("ftp://my.host.com:21/my/relative/directory?download=true&amp;stepwise=false&amp;delete=false")
  </code></pre>
  
  <p>Camel is connecting and listing the files in the directory correctly, however when it goes to process them, it throws the following exception for each file:</p>
  
  <pre><code>org.apache.camel.component.file.GenericFileOperationFailedException: Cannot retrieve file: RemoteFile[my/relative/directory/file1.txt] from: ftp://my.host.com:21/my/relative/directory?delete=false&amp;download=true&amp;stepwise=false
      at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:427)
      at org.apache.camel.component.file.remote.RemoteFileConsumer.processExchange(RemoteFileConsumer.java:137)
      at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:218)
      at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:182)
      at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:174)
      at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:101)
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
      at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
      at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
      at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
      at java.lang.Thread.run(Thread.java:748)
  </code></pre>
  
  <p>From the TRACE logs, I can see that Camel is listing the files in the directory correctly:</p>
  
  <pre><code>[TRACE] 2017-09-05 11:40:49,438 org.apache.camel.component.file.remote.FtpConsumer - Polling directory: my/relative/directory
  [TRACE] 2017-09-05 11:40:51,748 org.apache.camel.component.file.remote.FtpOperations - listFiles(my/relative/directory)
  [TRACE] 2017-09-05 11:40:58,657 org.apache.camel.component.file.remote.FtpConsumer - Found 3 in directory: my/relative/directory
  [TRACE] 2017-09-05 11:40:58,657 org.apache.camel.component.file.remote.FtpConsumer - FtpFile[name=/absolute/path/to/directory/file1.txt, dir=false, file=true]
  [TRACE] 2017-09-05 11:40:58,657 org.apache.camel.component.file.remote.FtpConsumer - FtpFile[name=/absolute/path/to/directory/file2.txt, dir=false, file=true]
  [TRACE] 2017-09-05 11:40:58,657 org.apache.camel.component.file.remote.FtpConsumer - FtpFile[name=/absolute/path/to/directory/file3.txt, dir=false, file=true]
  </code></pre>
  
  <p>When Camel tries to process each file however, it appears to be prepending the relative directory to the absolute directory and failing to find the resulting garbled path:</p>
  
  <pre><code>[TRACE] 2017-09-05 11:40:59,417 org.apache.camel.component.file.remote.FtpConsumer - Processing file: RemoteFile[absolute/path/to/directory/file1.txt]
  [TRACE] 2017-09-05 11:40:59,418 org.apache.camel.component.file.remote.FtpConsumer - Retrieving file: my/relative/directory//absolute/path/to/directory/file1.txt from: ftp://my.host.com:21/my/relative/directory?delete=false&amp;download=true&amp;stepwise=false
  [TRACE] 2017-09-05 11:40:59,418 org.apache.camel.component.file.remote.FtpOperations - retrieveFile(my/relative/directory//absolute/path/to/directory/file1.txt)
  [TRACE] 2017-09-05 11:40:59,418 org.apache.camel.component.file.remote.FtpOperations - Client retrieveFile: my/relative/directory//absolute/path/to/directory/file1.txt
  [WARN ] 2017-09-05 11:40:59,518 org.apache.camel.component.file.remote.FtpConsumer - Error processing file RemoteFile[absolute/path/to/directory/file1.txt] due to Cannot retrieve file: RemoteFile[absolute/path/to/directory/file1.txt] from: ftp://my.host.com:21/my/relative/directory?delete=false&amp;download=true&amp;stepwise=false
  </code></pre>
  
  <p>This path in the logs constructed by the FTPComponent is incorrect:</p>
  
  <blockquote>
    <p>Retrieving file:
    my/relative/directory//absolute/path/to/directory/file1.txt</p>
  </blockquote>
  
  <p>I debugged the Camel FTP consumer and it looks like <a href="https://github.com/apache/camel/blob/camel-2.19.x/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpConsumer.java#L238" rel="nofollow noreferrer">on line 238 is where the relative path is getting prepended to the absolute path</a></p>
  
  <p>Interestingly enough, <a href="https://github.com/apache/camel/blob/camel-2.19.x/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpConsumer.java#L208" rel="nofollow noreferrer">the SFTP component is doing the same thing</a> however it is working because <code>RemoteFileOperations&lt;ChannelSftp.LsEntry&gt;</code> does not set filename as an absolute path but <code>RemoteFileOperations&lt;FTPFile&gt;</code> does.</p>
  
  <p>Does anyone have any suggestions to work around this to get the FTP Conponent to consume the files? or am I doing something incorrectly?</p>
  
  <p>I'm using Camel 2.19.0</p>