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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перемещение файла 
V
    Опции темы
SeregaLBN
Дата 6.6.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ненашел нужной операции... Есть ли она?

А то пришлось писать своё:
Код

public static void moveFile(String sourceFileName, String destFileName) throws FileNotFoundException, IOException {
    FileChannel in = new FileInputStream(sourceFileName).getChannel();
    FileChannel out = new FileOutputStream(destFileName).getChannel();
    if (in != null && out != null)
        in.transferTo(0, in.size(), out);

    if (in != null)
        in.close();
    if (out != null)
        out.close();

    File f = new File(sourceFileName);
    boolean res = f.delete();
}


Но так ведь некорректно - делать копию, а потом удалять оригинал...
Ведь если оригинал кто-лио держит то delete неотработается, и в результате будет две копии.
PM MAIL   Вверх
fixxer
Дата 6.6.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 6
Всего: 27



File#renameTo(File dest)

не оно?


--------------------
user posted image
PM MAIL ICQ   Вверх
kkorsakoff
Дата 6.6.2007, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



renameTo имеет один недостаток, он работает в пределах одной директории.
Ну а так все верно - сначала копия, потом источник удаляется
PM MAIL WWW ICQ   Вверх
fixxer
Дата 6.6.2007, 15:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 6
Всего: 27



Цитата(kkorsakoff @ 6.6.2007,  15:07)
renameTo имеет один недостаток, он работает в пределах одной директории.

Простите, а где это написано?

Код

import java.io.*;

public class Test {
  public static void main(String[] argc) {

    File source = new File("c:/test.txt");
    
    File dest = new File("c:/temp/test2.txt");

    boolean result = source.renameTo(dest);

    System.out.println(result);
  }
}


работает. Что я делаю не так?


--------------------
user posted image
PM MAIL ICQ   Вверх
SeregaLBN
Дата 6.6.2007, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(fixxer @  6.6.2007,  15:04 Найти цитируемый пост)
File#renameTo(File dest)

не оно? 


Супер. Спасибо. Похоже что оно.

PS: Если renameTo вернет false, как узнать причину неудачи?
PM MAIL   Вверх
fixxer
Дата 6.6.2007, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 6
Всего: 27



Цитата(SeregaLBN @ 6.6.2007,  16:32)
Цитата(fixxer @  6.6.2007,  15:04 Найти цитируемый пост)
File#renameTo(File dest)

не оно? 


Супер. Спасибо. Похоже что оно.

PS: Если renameTo вернет false, как узнать причину неудачи?

хз. В доке написано что все это очень сильно зависит от платформы.


--------------------
user posted image
PM MAIL ICQ   Вверх
kkorsakoff
Дата 7.6.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если не в пределах директории, то надо вспомнить где он не работал.
Возможно если между разными дисками перемещаешь.
Опытным путем было установлено что в каких-то случаях метод не срабатывал. Куда проще не делать ветвлений для переименовался/не переименовался, а воспользоваться несложным копированием. Мы используем commons-io, где есть масса полезных и удобных методом для работы с файлами и вообще вводом/выводом.
PM MAIL WWW ICQ   Вверх
Shurr
Дата 7.6.2007, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 5
Всего: 7



Метод вполне рабочий, для простых операций. 
Единственное - не стоит использовать его для синхронизации при конкурентной работе, т.к. возвращаемое значение не всегда отражает реальный результат.
PM MAIL   Вверх
niasilil
Дата 7.6.2007, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 8
Всего: 9



Цитата(fixxer @ 6.6.2007,  15:24)
Цитата(kkorsakoff @ 6.6.2007,  15:07)
renameTo имеет один недостаток, он работает в пределах одной директории.

Простите, а где это написано?

Код

import java.io.*;

public class Test {
  public static void main(String[] argc) {

    File source = new File("c:/test.txt");
    
    File dest = new File("c:/temp/test2.txt");

    boolean result = source.renameTo(dest);

    System.out.println(result);
  }
}


работает. Что я делаю не так?

я бы все таки File.separator использовал, не только ведь под винды код пишется. 


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
Entry_N3
  Дата 3.12.2009, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А как переместить директорию, содержащую файлы и вложенные папки? (File#renameTo(File dest)
 почему-то не срабатывает; перемещается C:\A\B в С:\D)
PM MAIL   Вверх
Entry_N3
  Дата 3.12.2009, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нашел пример реализации - MovingFile.
PM MAIL   Вверх
LSD
Дата 4.12.2009, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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





--------------------
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   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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