2016-06-09 7 views
2

Я хочу удалить один файл и переименовать другой файл со старым файлом, но я не могу переместить этот файл, поскольку java бросает java.nio.file.FileAlreadyExistsException. фрагмент кода Я используюFiles.move и Files.copy бросает java.nio.file.FileAlreadyExistsException

static void swapData(String origFilePath, String tempFilePath) throws IOException{ 

     Path tempPath = FileSystems.getDefault().getPath(tempFilePath); 
     Path origPath = FileSystems.getDefault().getPath(origFilePath); 
     try{ 
      String origFileName = null; 
      File origFileRef = new File(origFilePath); 
      if(Files.exists(origPath)){ 
       origFileName = origFileRef.getName(); 
       Files.delete(origPath); 
       if(Files.exists(origPath)) 
        throw new IOException("cannot able to delete original file"); 
      } 
      if(origFileName != null) 
       Files.move(tempPath, tempPath.resolveSibling(origFileName), StandardCopyOption.REPLACE_EXISTING); 
     }catch(IOException e){ 
      throw e; 
     } 
    } 

Вот исключение я ПОЛУЧАТЬ enter image description here на Files.move(tempPath, tempPath.resolveSibling(origFileName), StandardCopyOption.REPLACE_EXISTING);

Кроме того, когда я вижу этот файл в окне проводника, его эскиз присутствует, но не может в состоянии открыть его. Я не могу понять, почему это происходит, и если я использую REPLACE_EXISTING, почему он выбрасывает исключение FileAlreadyExistsException.

Также я отредактировал предыдущий вопрос, так как он четко не указан.

Пожалуйста, помогите.

Anuj

+0

Можете ли вы указать свои ** на ** и ** из ** каталогов? –

+1

Уверен, это не проблема локального разрешения файловой системы? BTW: Я думаю, вы перепутали пути? «destPath» хранится в «moveFrom». Может быть, просто вопрос вкуса, но цель скорее должна быть целью («moveTo»). ;) ** edit ** Что касается разрешений: вы проверили, открыт ли файл, и у вашего пользователя есть разрешения на его доступ и запись в целевой каталог? – DoNuT

+0

Пожалуйста, обратитесь к новому заданному вопросу – aga

ответ

2

Проверьте, если у вас есть еще один поток, который на тот же ресурс файла во время работы Files.move или Files.copy. У меня был тот же самый симптом исключения и доступа к файлам и он смог его решить после сериализации доступа к файлам. не

Кроме того, с помощью опции REPLACE_EXISTING при выполнении Files.copy или Files.move, вам больше не нужно кодировать несколько шагов удаления исходного файла, а затем переименовать TMP, хотя Files.move или Files.copy не гарантируется атомарным. Существует опция ATOMIC_MOVE, однако мне не нравится конкретная гарантия реализации, где IOException может быть запущен, если файл уже существует, как описано в javadoc.

ATOMIC_MOVE: перемещение выполняется как операция с атомной файловой системой, а все остальные параметры игнорируются. Если целевой файл существует, то он специфичен для реализации, если существующий файл заменен или этот метод терпит неудачу, выбрасывая исключение IOException. Если перемещение не может выполняться как операция с использованием атомной файловой системы, то вызывается AtomicMoveNotSupportedException. Это может возникнуть, например, когда целевое местоположение находится в другом файловом хранилище и требует, чтобы файл был скопирован, или целевое местоположение связано с другим поставщиком этого объекта.