Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скачиваем фаилы с FTP Server 
:(
    Опции темы
ShurikA
Дата 17.12.2005, 07:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



вот написал я такой класс:
Код

public class FileCopyer {
    private FTPClient ftp;
    private FTPFile[] files;
    private String destDir;
    private JTextArea sharedStatus;
    private boolean coping = false;
    private File tempFile = null;
    private Timer gTimer;

    public FileCopyer(FTPClient client, String dest, JTextArea status, Timer timer) {
        if (client != null) {
            ftp = client;
        }
        destDir = dest+File.separator;
        sharedStatus = status;
        gTimer = timer;
    }

    public void start() {
        coping = true;
        gTimer.stop();
        FTPFile[] fRoot = getFileList(); 
        FTPFile[] userDir = null;

        this.changeDirectory("/");
        //sharedStatus.append(getCurentDir() + "\n");
        for (int i = 0; i < fRoot.length; i++) { //Root folder containing user's directories
            if (!fRoot[i].getName().startsWith(".") && fRoot[i].isDirectory()) {
                //Cteate Local User directory
                if (this.createDir(fRoot[i].getName())) {
                    //move deeper to User Dir in FTP Server
                    this.changeDirectory(getCurentDir() + fRoot[i].getName());
                    //sharedStatus.append(getCurentDir() + "\n");
                    userDir = getFileList();
                    if (isContains(userDir, "done")) {
                        //User Dir Containing Picture dir's
                        for (int j = 0; j < userDir.length; j++) {
                            if (!userDir[j].getName().startsWith(".") && userDir[j].isDirectory()) {
                                //Create Directories under user Dir
                                if (this.createDir(fRoot[i].getName()+File.separator+userDir[j].getName())) {
                                    //Move deeper to pics directory in User's Dir
                                    this.changeDirectory(getCurentDir()+"/"+userDir[j].getName());
                                    //sharedStatus.append(getCurentDir() + "\n");
                                    copyAllTo(destDir +
                                              fRoot[i].getName() +
                                              File.separator +
                                              userDir[j].getName());
                                    this.changeDirectory("..");
                                    //sharedStatus.append(getCurentDir() + "\n");
                                }
                            }
                        }
                    }
                }
            }
            this.changeDirectory("..");
            //sharedStatus.append(getCurentDir() + "\n");
        }
        coping = false;
        gTimer.start();
    }

    public void stop() {

    }

    public boolean isCoping() {
        return coping;
    }

    private FTPFile[] getFileList() {
        FTPFile[] tempF = null;

        try {
            tempF = ftp.listFiles();
        } catch (Exception e) {
            sharedStatus.append(e.toString() + "\n");
        }

        return tempF;
    }

    private void changeDirectory(String dir) {
        try {
            if (dir == "..") {
                ftp.changeToParentDirectory();
            } else {
                ftp.changeWorkingDirectory(dir);
            }
        } catch (Exception e) {
            sharedStatus.append(e.toString() + "\n");
        }
    }
    
    private String getCurentDir()
    {
        String dir = null;
        try {
           dir = ftp.printWorkingDirectory();
       } catch (Exception e) {
           sharedStatus.append(e.toString() + "\n");
       }

        return dir;
    }


    private boolean createDir(String name) {
        tempFile = new File(destDir + name);
        if(!tempFile.exists()){
            sharedStatus.append("Creating local directiry: " +
                                tempFile.getAbsoluteFile() + "... ");
            if (tempFile.mkdir()) {
                tempFile = null;
                sharedStatus.append("Done\n");
                return true;
            } else {
                sharedStatus.append("Failed\n");
                tempFile = null;
                return false;
            }
        }
        return true;
    }

    private boolean isContains(FTPFile[] dir, String file) {
        for (int i = 0; i < dir.length; i++) {
            if (dir[i].getName().startsWith(file)) {
                try {
                    ftp.deleteFile(file);
                } catch (Exception e) {
                    sharedStatus.append("Couldn't delete File: " +
                                        dir[i].getName() + "\n");
                }
                return true;
            }
        }
        return false;
    }

    private void copyAllTo(String dest) {
        FTPFile[] files = getFileList();
        try {
            for (int i = 0; i < files.length; i++) {
                if(!files[i].getName().startsWith(".")){
                    File file = new File(dest + File.separator +
                                         files[i].getName());
                    FileOutputStream fos = new FileOutputStream(file);
                    sharedStatus.append("Coping file: " + files[i].getName() +
                                        "...");
                    ftp.retrieveFile(files[i].getName(), fos);
                    fos.close();
                    sharedStatus.append("Done\n");
                    deleteFileFromServer(files[i].getName());
                }
            }
            sharedStatus.append("Done moving files from "+getCurentDir()+" to " + dest + "\n");
        } catch (Exception e) {
            sharedStatus.append("Couldn't move files from "+getCurentDir()+" to " + dest + "\nError: "+e.getMessage()+"\n");
        }
    }
    
    private void deleteFileFromServer(String fName)
    {
        sharedStatus.append("Deleting file: "+fName+"... ");
        try{
            if(ftp.deleteFile(fName))
                sharedStatus.append("Done\n");
            else
                sharedStatus.append("Failed\n");
        } catch (Exception e) {
            sharedStatus.append("Error: "+e.getMessage()+"\n"); 
        }
    }
}


он должен перекачивать все фаилы с сервера через ФТП на 2 уровня ниже корневой директории, по дороге создавая все под-директории на локалке. После чего каждый скаченный фаил нужно стереть на сервере. smile

Всё работает, но:
1. Скаченные фаилы - ломанные... smile
2. Дико тормозит комп. smile


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
batigoal
Дата 17.12.2005, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 2
Всего: 151



Цитата(ShurikA @ 17.12.2005, 08:04)
2. Дико тормозит комп. smile

Попробуй замерять, на какой стадии тормозит. Расставь замеры времени по коду.
Цитата(ShurikA @ 17.12.2005, 08:04)
1. Скаченные фаилы - ломанные...

Попробуй поставить перед
Код

fos.close();

Код

fos.flush();
fos.close();



--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
LSD
Дата 17.12.2005, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Я подозреваю что это из-за того, что файлы передаются в ASCII режиме. Попробуй в коструктор дабавить:
Код
if(client != null)
{
  ftp = client;
  if(!ftp.setFileType(FTPClient.BINARY_FILE_TYPE))
    throw new RuntimeException("Could not set binary transfer mode");
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
ShurikA
Дата 17.12.2005, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Цитата(LSD @ 17.12.2005, 12:31)
Я подозреваю что это из-за того, что файлы передаются в ASCII режиме. Попробуй в коструктор дабавить:

Никакие варианты не помогают... Причём я пробовал так же менять на всякие setFileTransferMode - по барабану.

Код

fos.flush();

тоже самое.


Цитата(Lamer @ 17.12.2005, 11:06)
Попробуй замерять, на какой стадии тормозит. Расставь замеры времени по коду.

это немного не реально, но мне отдаёт все данные в sharedStatus только после того как уже закончол всю равоту...
То есть на самом деле понятно где он тормозит: public void start()



--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
ShurikA
Дата 17.12.2005, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



И кстати он мне не даёт выставить: ftp.setFileType


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
ShurikA
Дата 17.12.2005, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Нашёл я тупую ошибку!!!!
Я сначало пытался выставить ftp.setFileType, а потом подключался. smile
Всё работает, но немного притормаживает...


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
LSD
Дата 17.12.2005, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(ShurikA @ 17.12.2005, 18:56)
Всё работает, но немного притормаживает...

Вот и надо разобраться где тормозит smile
Как я понял самый главный метод это start(), значит там где ты его вызываешь пишешь, что-то наподобие:
Код
long start = System.currentTimeMillis();
start();
long stop = System.currentTimeMillis();
System.out.println("start() work: " + (stop - start));

И так для каждого метода (getFileList(), getCurentDir(), copyAllTo() и т.д.).

Это раз, во вторых что значит тормозит, медленно работает или загрузка процессора 100%?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
ShurikA
Дата 17.12.2005, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Цитата(LSD @ 17.12.2005, 21:31)
что значит тормозит, медленно работает или загрузка процессора 100%?

Нет, тормозит только окно проги. причём только при скачивании.


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
LSD
Дата 19.12.2005, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(ShurikA @ 17.12.2005, 23:40)
тормозит только окно проги. причём только при скачивании

А загрузка процессора какая?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
igon
Дата 20.12.2005, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 2
Всего: 21



Цитата
тормозит только окно проги. причём только при скачивании
А окно и собственно скачивание "крутятся" в одном threade`e?
Попробуй разнести их по разным


--------------------
Хотите поговорить об этом?
PM   Вверх
ShurikA
Дата 20.12.2005, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



igon
LSD
Я исправлю себя:
Не то что тормозит...
Просто выдаёт все данные в sharedStatus только после тлгл как заканчивает скачивать.


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
LSD
Дата 20.12.2005, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(ShurikA @ 20.12.2005, 14:33)
Просто выдаёт все данные в sharedStatus только после тлгл как заканчивает скачивать.

Т.е. igon был прав, у тебя скачивание идет в AWT-EventQueue.
Вынеси скачивание файлов в отдельный поток:
Код
public class DownloadThread extends Thread
{
  private FileCopyer copyer;
  
  public DownloadThread(FileCopyer copyer)
  {
    super("DownloadThread");
    this.copyer = copyer;
  }
  
  public void run()
  {
    copyer.start();//Копируем файлы
  }
}

А там где надо начать копирование пишем:
Код
DownloadThread downloadThread = new DownloadThread(copyer);
downloadThread.start();



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
ShurikA
Дата 20.12.2005, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



LSD
Всё хорошо и красиво, но только то что выдаётся в status приходит из downloadThread.
Если я их разношу мне придётся эти данные запрашивать каждый раз из downloadThread...
Не так ли?


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
LSD
Дата 20.12.2005, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



1. Там вроде FileCopyer сам добавляет данные в sharedStatus.
2. Как я понимаю ты сейчас создаешь свое окно с JTextArea, затем создаешь FileCopyer в качестве аргумента ему передаешь ранее созданный JTextArea, так? Если да, то ничего дополнительно по обновлению делать не надо. Надо подумать насчет того как управлять процессом скачивания, запустить, приоставновить, остановить совсем.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
sergejzr
Дата 20.12.2005, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Цитата(ShurikA @ 20.12.2005, 14:07)
Всё хорошо и красиво, но только то что выдаётся в status приходит из downloadThread.
Если я их разношу мне придётся эти данные запрашивать каждый раз из downloadThread...
Не так ли?

Не надо запрашивать. добавь в downloadThread свой Listener, который будет рисовать в главном окне.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0751 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.