2011-01-03 2 views
1

У меня есть следующие Java код, выполняемый в модуле медиа:Java RenameTo() функция не движется файл

File file = new File("/my/path/"+String.format("%02d", date)+"/"+streamAliasRef+".mp4"); 

     // Destination directory 
     File dir = new File("/mnt/s3"); 

     // Move file to new directory 
     boolean success = file.renameTo(new File(dir, file.getName())); 
     if (!success) { 
      getLogger().info("File failed to move to s3"+file.getName()); 
     } 
     else { 
      getLogger().info("File moved to s3 successfully"+ file.getName()); 
     } 

По какой-то причине я постоянно получаю «Файл не удалось перейти к s3»

I 'm довольно новичок в Java, так что простите меня, если это простая проблема. Я знаю, что оба каталога существуют. Одна важная нота, которая может иметь какое-то отношение к ней, я использую Fuse для монтирования ведро S3 в файловую систему.

+0

Файл может быть перемещен только в том случае, если существует все дерево каталогов источника и назначения, не могли бы вы подтвердить это? –

+0

Ну, новый файл генерируется каждый раз с помощью нового StreamAliasRef, есть ли способ подтвердить, что файл File фактически захватил файл? –

+1

Вы можете использовать 'File.isFile()', 'File.isDirectory()' и 'File.exists()' –

ответ

7

В Java, работающем на unix, renameTo работает только в том случае, если вы находитесь в одной файловой системе. Поэтому, если вы перемещаетесь по файловым системам, вам нужно будет скопировать и удалить оригинал. Команда unix mv делает это также. Вот почему mv мгновенно работает в одной и той же файловой системе, но берет навсегда файловые системы. Он обнаруживает разные файловые системы и в этом случае удаляет копию.

2

Я использую этот метод из гуавы, чтобы переместить файлы на Unix, чтобы обойти эту проблему:

public static void move(File from, File to) throws IOException { 
    Preconditions.checkNotNull(to); 
    Preconditions.checkArgument(!from.equals(to), 
    "Source %s and destination %s must be different", from, to); 
    if (!from.renameTo(to)) { 
    copy(from, to); 
    if (!from.delete()) { 
     if (!to.delete()) { 
     throw new IOException("Unable to delete " + to); 
     } 
     throw new IOException("Unable to delete " + from); 
    } 
    } 
}

1

Прежде всего, вы уверены, что

new File("/my/path/"+String.format("%02d", date)+"/"+streamAliasRef+".mp4") 

действительно существует? Не могли бы вы проверить с file.exists() перед попыткой переместить его?

Смежные вопросы