Есть несколько вещей, которые вы можете сделать, чтобы упростить код:
Используйте Path#of(String,String...)
или Paths#get(String,String...)
, чтобы создайте свои Path
экземпляры. Оба метода делегируют значение по умолчанию FileSystem
. Первый был добавлен в Java 11 и теперь является предпочтительным подходом.
Используйте Path#resolve(Path)
, чтобы добавить относительный путь к некоторому абсолютному пути.
Но в вашем коде также есть ошибка. Вы повторяете oldDir
, что работает, потому что Path
реализует Iterable<Path>
. Однако , который перебирает имена пути, а не дочерние элементы пути. Другими словами, это:
Path path = Path.of("foo", "bar", "file.txt");
for (Path name : path) {
System.out.println(name);
}
Будет выводить:
foo
bar
file.txt
Если вы хотите перебирать дочерние элементы каталога, вам нужно использовать что-то вроде Files#list(Path)
или Files#newDirectoryStream(Path)
(у последнего две перегрузки). Оба эти метода возвращают только непосредственных дочерних элементов каталога. Существуют и другие методы рекурсивного перебора каталога и его подкаталогов; просмотрите документацию Files
, чтобы узнать, что предоставляется.
Таким образом, ваш код должен выглядеть примерно так:
Path oldDir = Path.of(...);
Path newDir = Path.of(...);
try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(oldDir)) {
for (Path oldFile : dirStream) {
Path newFile = newDir.resolve(oldFile.getFileName());
Files.copy(oldFile, newFile);
}
}