Копирование файла Java в непустую папку назначения

#java #file #path #move

#java #файл #путь #переместить

Вопрос:

У меня возникают реальные трудности с выяснением того, как это должно быть закодировано без использования FileUtils import. Я нашел тысячи руководств о том, как перемещать файлы в пустые папки, это просто. Сложность заключается в том, чтобы выяснить, как Java может перемещать файлы в каталоги, в которых уже есть файлы в папке. Насколько я понимаю, параметр REPLACE_EXISTING означает, что он перезапишет идентичные имена файлов, если они обнаружены в каталоге назначения, но в каталоге нет файла с именем, совпадающим с именем файла, который я пытаюсь скопировать / переместить. Чего мне не хватает? Как я могу это сделать?

java.nio.file.Возникает исключение DirectoryNotEmptyException.

 enter code here

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;



public class Move {
 static File source = new File("sourcefolderhere");
static File destination = new File("destfolderhere");


public static void move(File src, File dest) throws IOException {
    Files.move(src.toPath().toAbsolutePath(), dest.toPath().toAbsolutePath(),
            StandardCopyOption.REPLACE_EXISTING);         
}

public static void main(String[] args) throws IOException { 

try {       
    if(source.isDirectory() amp;amp; destination.isDirectory()) {         
        File[] content = source.listFiles();           
        for(int i = 0; i < content.length; i  ) {
            System.out.println(content[i]);  
            move(source, destination);                
        }            
    }
    else if (!destination.isDirectory()){ 
        System.out.println("create folder here");
        destination.mkdir();
        File[] content = source.listFiles();           
        for(int i = 0; i < content.length; i  ) {
            move(source, destination);              
        }
    }
 }
 catch(Exception ex) {   System.out.println(ex);    
 }
 finally {
    
 }
 }
 }
  

Комментарии:

1. Если вы знаете , что в каталоге назначения нет файлов с именами, соответствующими исходным файлам, которые вы копируете / перемещаете, то конфликта нет, и каталог назначения также может считаться пустым. Я не понимаю, в чем заключается ваша предполагаемая проблема. Что вы на самом деле пытаетесь спросить здесь?

2. Если в каталоге уже есть файл с тем же именем, как вы собираетесь поместить туда другой файл с тем же именем еще раз? Я бы посоветовал вам добавить еще одну ветку IF с проверкой: если есть файл с таким именем — вы меняете имя нового на какое-то другое значение. если нет -> вы копируете файл обычным способом.

3. Скажите, правильно ли я понял ваше намерение, и я предоставлю вам фрагмент кода, который добавляет суффикс индексов в цикле, пока имя файла не станет уникальным.

4. Пожалуйста, попробуйте этот снипет. Это без FileUtils private static void copy(File src, File dest) throws IOException { try (InputStream is = new FileInputStream(src); OutputStream os new FileOutputStream(dest) { // buffer size 1K byte[] buf = new byte[1024]; int bytesRead; while ((bytesRead = is.read(buf)) > 0) { os.write(buf, 0, bytesRead); } } }

5. REPLACE_EXISTING не требует существования существующего файла с таким же именем. Использование REPLACE_EXISTING означает, что если файл с таким же именем существует, его следует перезаписать. Если нет существующего файла с таким именем, REPLACE_EXISTING игнорируется.

Ответ №1:

Я попробовал код в методе IDE File.move с параметром StandardCopyOption.REPLACE_EXISTING работает, только если у вас есть файл в папке назначения. в противном случае используйте File.move обычным способом. Я также немного изменил ваш код, чтобы избежать дублирования кода.

 import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.Arrays;

public class Move {
    static File source = new File("sourcefolderhere");
    static File destination = new File("destfolderhere");

    public static void move(File src, File dest) throws IOException {
        System.out.println(src.getName());
        if(isExist(src.getName()))
            Files.move(src.toPath().toAbsolutePath(), Paths.get(destination.getAbsolutePath() File.separator src.getName()) , StandardCopyOption.REPLACE_EXISTING);
        else
            Files.move(src.toPath().toAbsolutePath(), Paths.get(destination.getAbsolutePath() File.separator src.getName()));
    }
    
    public static boolean isExist(String souceFileName){
        //If you are not using java 8 code
        /*String[] destFiles = destination.list();
        for(String fileName : destFiles){
            if(souceFileName.equals(fileName))
                return true;
        }
        return false;*/
        return Arrays.stream(destination.list())
                .anyMatch(fileName -> fileName.equals(souceFileName));
    }

    public static void main(String[] args) throws IOException {

        try {
            if(!source.isDirectory())
                throw new IllegalArgumentException("Source Folder doesn't Exist");
            if(!destination.exists())
                destination.mkdir();
            if (source.isDirectory() amp;amp; destination.isDirectory()) {
                File[] content = source.listFiles();
                for (int i = 0; i < content.length; i  ) {
                    System.out.println(content[i]);
                    move(content[i], destination);
                }
            }
        } catch (Exception ex) {
            System.out.println(ex);
        } finally {

        }
    }
}```
  

Комментарии:

1. Спасибо. Я пробовал это, он по-прежнему не копирует файл в каталог, в котором уже есть содержимое. Я все еще получаю файл. Исключение DirectoryNotEmptyException

2. Я попробовал следующий сценарий. destfldr -> file1.txt sourcefldr -> file1.txt ,file2.txt . Результатом был destfldr -> file1.txt ,file2.txt и sourcefldr -> nofile . У меня это работает! Является ли перемещение файла рекурсивным? имеется ли в виду вложенная папка для перемещения?

3. В том-то и дело, что я не ввожу имена файлов вручную, я перебираю папку для каждого файла. Имена меняются, и я не могу узнать, какими будут новые имена.

4. Можете ли вы привести мне пример с файлами и папками источника и назначения

5. Я не использую отдельные файлы. статический источник файла = новый файл («\\ serverfolderпапка»);