Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Перемещение файла


Автор: SeregaLBN 6.6.2007, 14:46
Ненашел нужной операции... Есть ли она?

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

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 неотработается, и в результате будет две копии.

Автор: fixxer 6.6.2007, 15:04
File#renameTo(File dest)

не оно?

Автор: kkorsakoff 6.6.2007, 15:07
renameTo имеет один недостаток, он работает в пределах одной директории.
Ну а так все верно - сначала копия, потом источник удаляется

Автор: 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);
  }
}


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

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

не оно? 


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

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

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

не оно? 


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

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

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

Автор: kkorsakoff 7.6.2007, 12:22
Если не в пределах директории, то надо вспомнить где он не работал.
Возможно если между разными дисками перемещаешь.
Опытным путем было установлено что в каких-то случаях метод не срабатывал. Куда проще не делать ветвлений для переименовался/не переименовался, а воспользоваться несложным копированием. Мы используем commons-io, где есть масса полезных и удобных методом для работы с файлами и вообще вводом/выводом.

Автор: Shurr 7.6.2007, 12:30
Метод вполне рабочий, для простых операций. 
Единственное - не стоит использовать его для синхронизации при конкурентной работе, т.к. возвращаемое значение не всегда отражает реальный результат.

Автор: niasilil 7.6.2007, 22:09
Цитата(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 использовал, не только ведь под винды код пишется. 

Автор: Entry_N3 3.12.2009, 15:53
А как переместить директорию, содержащую файлы и вложенные папки? (File#renameTo(File dest)
 почему-то не срабатывает; перемещается C:\A\B в С:\D)

Автор: Entry_N3 3.12.2009, 17:03
Нашел пример реализации - http://www.roseindia.net/java/example/java/io/MovingFile.shtml.

Автор: LSD 4.12.2009, 13:04
http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)