Способ копирования всего содержимого каталога в другой каталог в java или groovy?
Скопировать содержимое всего каталога в другой каталог?
Ответ 1
Копирует весь каталог на новое место, сохраняющее файл даты. Этот метод копирует указанный каталог и все его дочерние элементы каталогов и файлов к указанным место назначения. Место назначения - новое местоположение и название каталог.
Создан целевой каталог если он не существует. Если каталог назначения существовал, тогда этот метод объединяет источник с пункт назначения, с использованием источника старшинство.
Ответ 2
Ниже приведен пример использования JDK7.
public class CopyFileVisitor extends SimpleFileVisitor<Path> {
private final Path targetPath;
private Path sourcePath = null;
public CopyFileVisitor(Path targetPath) {
this.targetPath = targetPath;
}
@Override
public FileVisitResult preVisitDirectory(final Path dir,
final BasicFileAttributes attrs) throws IOException {
if (sourcePath == null) {
sourcePath = dir;
} else {
Files.createDirectories(targetPath.resolve(sourcePath
.relativize(dir)));
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(final Path file,
final BasicFileAttributes attrs) throws IOException {
Files.copy(file,
targetPath.resolve(sourcePath.relativize(file)));
return FileVisitResult.CONTINUE;
}
}
Чтобы использовать посетителя, сделайте следующее
Files.walkFileTree(sourcePath, new CopyFileVisitor(targetPath));
Если вы предпочитаете просто встроить все (не слишком эффективно, если вы часто используете его, но хорошо для быстрых)
final Path targetPath = // target
final Path sourcePath = // source
Files.walkFileTree(sourcePath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(final Path dir,
final BasicFileAttributes attrs) throws IOException {
Files.createDirectories(targetPath.resolve(sourcePath
.relativize(dir)));
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(final Path file,
final BasicFileAttributes attrs) throws IOException {
Files.copy(file,
targetPath.resolve(sourcePath.relativize(file)));
return FileVisitResult.CONTINUE;
}
});
Ответ 3
С Groovy вы можете использовать Ant:
new AntBuilder().copy( todir:'/path/to/destination/folder' ) {
fileset( dir:'/path/to/src/folder' )
}
Ответ 4
public static void copyFolder(File source, File destination)
{
if (source.isDirectory())
{
if (!destination.exists())
{
destination.mkdirs();
}
String files[] = source.list();
for (String file : files)
{
File srcFile = new File(source, file);
File destFile = new File(destination, file);
copyFolder(srcFile, destFile);
}
}
else
{
InputStream in = null;
OutputStream out = null;
try
{
in = new FileInputStream(source);
out = new FileOutputStream(destination);
byte[] buffer = new byte[1024];
int length;
while ((length = in.read(buffer)) > 0)
{
out.write(buffer, 0, length);
}
}
catch (Exception e)
{
try
{
in.close();
}
catch (IOException e1)
{
e1.printStackTrace();
}
try
{
out.close();
}
catch (IOException e1)
{
e1.printStackTrace();
}
}
}
}
Ответ 5
- Использовать Apache FileUtils.copyDirectory
- Написать ваш собственный, например. этот парень предоставляет пример кода.
- Java 7: посмотрите java.nio.file.Files.
Ответ 6
Ни FileUtils.copyDirectory() и Архимед отвечает атрибутам каталога копирования ( владелец файла, разрешения, время модификации и т.д.).
fooobar.com/questions/51809/... предоставляет полное решение JDK7, которое делает именно это.
Ответ 7
Это мой кусок кода Groovy для этого. Проверено.
private static void copyLargeDir(File dirFrom, File dirTo){
// creation the target dir
if (!dirTo.exists()){
dirTo.mkdir();
}
// copying the daughter files
dirFrom.eachFile(FILES){File source ->
File target = new File(dirTo,source.getName());
target.bytes = source.bytes;
}
// copying the daughter dirs - recursion
dirFrom.eachFile(DIRECTORIES){File source ->
File target = new File(dirTo,source.getName());
copyLargeDir(source, target)
}
}
Ответ 8
При входе в Java NIO ниже также возможно решение
import java.io.IOException;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.function.Consumer;
import java.util.stream.Stream;
public class Test {
public static void main(String[] args) {
Path sourceParentFolder = Paths.get("/sourceParent");
Path destinationParentFolder = Paths.get("/destination/");
try {
Stream<Path> allFilesPathStream = Files.walk(sourceParentFolder);
Consumer<? super Path> action = new Consumer<Path>(){
@Override
public void accept(Path t) {
try {
String destinationPath = t.toString().replaceAll(sourceParentFolder.toString(), destinationParentFolder.toString());
Files.copy(t, Paths.get(destinationPath));
}
catch(FileAlreadyExistsException e){
//TODO do acc to business needs
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
allFilesPathStream.forEach(action );
} catch(FileAlreadyExistsException e) {
//file already exists and unable to copy
} catch (IOException e) {
//permission issue
e.printStackTrace();
}
}
}
Ответ 9
Что касается Java, в стандартном API такого метода нет. В Java 7 класс java.nio.file.Files
предоставит copy метод удобства.
Ссылки
Ответ 10
Если вы открыты для использования сторонней библиотеки, проверьте javaxt-core. Класс javaxt.io.Directory можно использовать для копирования таких каталогов:
javaxt.io.Directory input = new javaxt.io.Directory("/source");
javaxt.io.Directory output = new javaxt.io.Directory("/destination");
input.copyTo(output, true); //true to overwrite any existing files
Вы также можете указать фильтр файлов, чтобы указать, какие файлы вы хотите скопировать. Здесь есть еще несколько примеров: