Как получить последний созданный файл из каталога FTP?

#android #ftp #timestamp

#Android #ftp #временная метка

Вопрос:

Сначала я хочу получить список файлов, хранящихся в каталоге FTP, а затем получить имя последнего созданного файла, используя временную метку. И я получаю окно предупреждения : Activity is not responding . После проверки записи logcat я замечаю, что код никогда не достигает строки :

Log.e("FTP", "number of filenames: " count);

Но я понимаю Log.e("FTP", "Connexion successful "); , что подключение к серверу кажется нормальным.

Похоже, что-то там не так. Может кто-нибудь помочь мне справиться с этим. Или покажите мне простой способ получить последний созданный файл с директора FTP-сервера?

 FTPClient ftpClient = new FTPClient();
try 
{
    ftpClient.connect(InetAddress.getByName(Fonctions.address), Integer.parseInt(Fonctions.port));              
    if (ftpClient.login(Fonctions.login, Fonctions.pass))
    {                           
    Log.e("FTP", "Connexion successful ");
    String workDir = ftpClient.printWorkingDirectory();
    //Log.e("FTP", "workdir:"   workDir);

    int count = ftpClient.listNames().length;   
    Log.e("FTP", "number of filenames: "   count);
    FTPFile [] dossier = new FTPFile[count];                                
    FTPFile back = new FTPFile();

    dossier = ftpClient.listDirectories("Sarelo_FTP");
    back = dossier[0];
    Log.e("FTP", "Avant boucle "   back);
    int buf = 0;
    for (int i=0;i<(dossier.length) - 1;i  )
      {
       for (int j=1;j<dossier.length;j  )
         {
          buf = back.getTimestamp().compareTo(dossier[j].getTimestamp());                                   
          if (buf == -1)
            back = dossier[j];
         }                          
      } 
    Log.e("FTP", "fichier final le plus récent: "   back.getName());
    }
    else{
        Log.e("Restore FTP", "Error while connecting to FTP server");
    }
} 
catch(IOException e)
{
String title = "Error connecting to FTP server";
String msg = "Please check your parameters and connexion info: login, password,port number";
f.alert(c, title, msg).show();
Log.e("Restore FTP", "Error while connecting to FTP server", e);
}
  

P.S: Я не могу получить список файлов в каталоге, поэтому я не знаю, работает ли мой код для извлечения последнего созданного файла. Любая помощь по этому вопросу также будет оценена.

[Редактировать] Это моя асинхронная задача для получения списка файлов в каталоге. Но он все еще не работает. Я не получаю приложение, которое больше не отвечает, но, похоже, оно больше ничего не делает. Выполнение застревает в одной и той же точке (не может быть достигнуто Log.e("FTP", "number of filenames: " count); )

 class getFilesFromFtp extends AsyncTask
{
    @Override
    protected String doInBackground(Object... params) 
    {
        int count = 0;
        try 
        {
            Log.e("FTP", "avant names: "   count);
            count = ftpClient.listNames().length;
            Log.e("FTP", "names: "   count);
            handler.sendMessage(handler.obtainMessage());
        } 
        catch (IOException e) {                                 
            Log.e("FTP", "Error getting number of files ", e);
        }           
    return null;
   }
}
  

Спасибо за помощь.

Ответ №1:

Вы не должны выполнять долго работающий код в потоке пользовательского интерфейса. Thia блокирует перерисовку пользовательского интерфейса и обработку событий. Он также производит ANR.

Вы должны запустить его в фоновом потоке, предпочтительно через ‘AsyncTask’.

Комментарии:

1. Спасибо за уведомление, и как я могу это сделать? Это моя первая попытка программирования на Android и Java.

Ответ №2:

Первая проблема решена. Мне просто нужно было активировать пассивный режим передачи данных FTP, например:

 ftpClient.enterLocalPassiveMode();
  

перед строкой int count = ftpClient.listNames().length; .

Надеюсь, это поможет другим людям. Благодаря @Peter Knego, который привел меня к AsynkTask. Я узнал кое-что новое. 🙂