sftp a usuwanie pliku

0

heja,

jest taka sytuacja: pisze prosty program, ktory miedzy innymi ma za zadanie wysłać plik na serwer sftp i skasować następnie z dysku plik, który wysłano.... i tu pojawia się problem, ponieważ plik nie chce się usunąć:

new TestJSch(computer_name); //(1)
		
File f = new File("C://" + computer_name + ".txt");
System.out.println(f.getAbsolutePath());
f.delete();

bez linijki (1) wysyłającej plik na serwer, plik się usunie.

Oto kod TestJSch.java :

import java.io.File;
import java.io.FileInputStream;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

class TestJSch {
	
    public TestJSch(String computer_name) {
    
    	try {
            String ftpHost = "sftp.pjwstk.edu.pl";
            int ftpPort = 22;
            String ftpUserName = "X";
            String ftpPassword = "Y";
            String ftpRemoteDirectory = "Z";
            String fileToTransmit = "C://" + computer_name + ".txt";
            
            System.out.println("Creating session.");
            JSch jsch = new JSch();
            Session session = null;
            Channel channel = null;
            ChannelSftp c = null;
         
            try {
                session = jsch.getSession(ftpUserName, ftpHost, ftpPort);
                System.out.println("Session created.");    
                session.setPassword(ftpPassword);
    
            
                java.util.Properties config = new java.util.Properties();
                config.put("StrictHostKeyChecking", "no");
                session.setConfig(config);
                session.connect();
                System.out.println("Session connected.");
    

                System.out.println("Opening Channel.");
                channel = session.openChannel("sftp");
                channel.connect();
                c = (ChannelSftp)channel;
            } catch (Exception e) {
                System.err.println("Unable to connect to FTP server. "+e.toString());
                throw e;
            }            
            
            System.out.println("Changing to FTP remote dir: " + ftpRemoteDirectory);
            c.cd(ftpRemoteDirectory);            
            
            try {
                File f = new File(fileToTransmit);
                System.out.println("Storing file as remote filename: " + f.getName());
                c.put(new FileInputStream(f), f.getName());
            } catch (Exception e) {
                System.err.println("Storing remote file failed. "+e.toString());
                throw e;
            }

            try {
                c.quit();
                session.disconnect();
            } catch (Exception exc) {
                System.err.println("Unable to disconnect from FTP server. " + exc.toString());
            }            
                        
        } catch (Exception e) {
            System.err.println("Error: "+e.toString());
        }
        
        System.out.println("Process Complete.");
       
    }    
}
  

0

W kodzie, który zamieściłes nie ma usuwania.

0

jest w 4. linijce od góry...?

0

Imo, usuwanie musi być wewnątrz TestJSch, po wysłaniu i zamknięciu sesji, a tam usuwania nie widziałem.

0

hmmm.... a co za różnica, gdzie znajduje się usuwanie? plik został stworzony wcześniej, i ma zostać skasowany i tak PO wysłaniu i zamknięciu sesji...

0

poza tym - wrzuciłem kod usuwający do pliku tesjsch.java, i dalej mam to samo ...

0

A skąd Twoja pewność, że

new TestJSch(computer_name); //(1)
               
File f = new File("C://" + computer_name + ".txt");
System.out.println(f.getAbsolutePath());
f.delete(); // tutaj plik jest wysłany i sekcja zamknięta?
0

Sprawdź też w dokumentacji czy wystarczy c.quit(). Może trzeba chanel zamknąć.

0

hmmm, temat staaary, ale problem powrócił - nadal nierozwiązany:

zamykam wszystko, co da się zamknąć:

session.disconnect();
                c.disconnect();
                channel.disconnect();
                c.quit();

wygląda na to, że nie jestem już połączony z serwerem - jednak plik nadal nie chce się usunąć.
ma ktoś jakiś pomysł?

0

A zamknales strumien do tego pliku ktory wyslales na serwer, i chcesz usunac? PEwnie siedzisz pod winda, a tam jak proces nie zamknie strumienia to nie mozna skasowac. Pobierznie czytalem kod i nie widzialem.

0

strumień jest zamknięty; błąd tkwi w kodzie tutaj zamieszczonym...rzeczywiście pracuję pod windowsem;

przed samym zakończeniem programu wrzuciłem Thread.sleep() i próbowałem manualnie usunąć plik - program nadal go używa, tak jakby cały czas wysyłał go na serwer....a to przecież niemożliwe.

0

Nie widze zeby strumien pliku byl zamykany, widze tylko takie cos:

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

i tego strumienia nie zamykasz. Nie wiem co robi metoda c.put(), moze ona zamyka, jesli jednak nie, to mysle ze jednak to jest problem.

0

łoooooo..... [glowa]

dzieki...

1 użytkowników online, w tym zalogowanych: 0, gości: 1