#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папка»);