2015-07-25 2 views
1

Я хочу удалить файл на моем локальном компьютере после переноса файла с моей локальной машины на мою удаленную машину ubuntu через SSH. Файл отправляется успешно, но файл не удаляется. Пожалуйста, помогитеЛокальный файл не удаляется после загрузки с помощью SFTP

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import com.jcraft.jsch.Channel; 
import com.jcraft.jsch.ChannelSftp; 
import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.JSchException; 
import com.jcraft.jsch.Session; 
import com.jcraft.jsch.SftpException; 

public class Scp { 

    public Scp() { 

    } 

    public static void transfer() { 
     String SFTPHOST = "ip address"; 
     int SFTPPORT = 22; 
     String SFTPUSER = "username"; 
     String SFTPPASS = "password"; 
     String SFTPWORKINGDIR = "workingDirPath"; 

     Session session = null; 
     Channel channel = null; 
     ChannelSftp channelSftp = null; 
     System.out.println("preparing the host information for sftp."); 
     JSch jsch = new JSch(); 
     try { 
      session = jsch.getSession(SFTPUSER, SFTPHOST, SFTPPORT); 
      //session.connect(30000); 
     } catch (JSchException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     session.setPassword(SFTPPASS); 
     java.util.Properties config = new java.util.Properties(); 
     config.put("StrictHostKeyChecking", "no"); 
     session.setConfig(config); 
     try { 
      session.connect(); 
     } catch (JSchException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     System.out.println("Host connected."); 
     try { 
      channel = session.openChannel("sftp"); 
     } catch (JSchException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      channel.connect(); 
     } catch (JSchException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     System.out.println("sftp channel opened and connected."); 
     try { 
      channelSftp = (ChannelSftp) channel; 
      System.out.println(SFTPWORKINGDIR); 
      channelSftp.cd(SFTPWORKINGDIR); 
     } catch (SftpException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     //String path = System.getProperty("user.home"); 
     File f = new File("C:/Users/khun/testFile.txt"); 
     try { 

      channelSftp.put(new FileInputStream(f), f.getName()); 

     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (SftpException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     System.out.println("File transfered successfully to host."); 
     channelSftp.exit(); 
     System.out.println("sftp Channel exited."); 
     channel.disconnect(); 
     System.out.println("Channel disconnected."); 
     session.disconnect(); 
     System.out.println("Host Session disconnected."); 

     f.getAbsolutePath(); 
     if(f.delete()) { 
      System.out.println("File is deleted"); 
     } 
    } 

    public static void main(String[] args) { 
     transfer(); 
    } 
} 
+0

Есть ли какое-то исключение или что-то еще? – pL4Gu33

+0

, к сожалению, нет никакого исключения. – user3820292

+2

[Не используйте класс 'File' в современном коде] (http://java7fs.wikia.com/wiki/Why_File_sucks). Используйте ['java.nio.file.Files'] (http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html) и связанные классы. – RealSkeptic

ответ

0

Проблема может быть в потоке. Уже открыт ли поток? Я не знаю, если channelSftp.exit(); channel.disconnect(); session.disconnect(); закрыть поток. (Никогда не работал с Jsch)

Можете ли вы попытаться закрыть его вручную?

, например:

File f = new File("test.txt"); 
f.createNewFile(); 
System.out.println(f.exists()); 
InputStream stream = new FileInputStream(f); 
System.out.println(f.delete()); 

Удалять возвращает ложь.

File f = new File("test.txt"); 
f.createNewFile(); 
System.out.println(f.exists()); 
InputStream stream = new FileInputStream(f); 
stream.close(); 
System.out.println(f.delete()); 

delete возвращает true.

1
File f = new File("C:/Users/khun/testFile.txt"); 
try { 
    channelSftp.put(new FileInputStream(f), f.getName()); 
} catch ... 

Вы открываете чтение FileInputStream из файла, а затем никогда не закрываете его. Обычно Windows не позволяет удалить файл, который в настоящее время открыт. Когда вы открываете файл, вам нужно подумать о том, чтобы убедиться, что он в конце концов закрыт. Используя синтаксис примерочного с-ресурсов, вы можете сделать это:

File f = new File("C:/Users/khun/testFile.txt"); 
try (FileInputStream stream = new FileInputStream(f)) { 
    channelSftp.put(stream, f.getName()); 
} catch ... 

С помощью этого синтаксиса Java автоматически закрывает поток, когда управление покидает try блока.

Смежные вопросы