Подтвердить что ты не робот

Как скопировать файлы в Groovy

Мне нужно скопировать файл в Groovy и увидеть некоторые способы его достижения в Интернете:

1

new AntBuilder().copy( file:"$sourceFile.canonicalPath", 
                           tofile:"$destFile.canonicalPath")

2

command = ["sh", "-c", "cp src/*.txt dst/"]
Runtime.getRuntime().exec((String[]) command.toArray())

3

 destination.withDataOutputStream { os->  
    source.withDataInputStream { is->  
       os << is  
    }  
 }  

4

import java.nio.file.Files
import java.nio.file.Paths
Files.copy(Paths.get(a), Paths.get(b))

4-й способ кажется мне самым чистым, так как я не уверен, насколько хорошо использовать AntBuilder и насколько он тяжелый, я видел, как некоторые люди сообщали о проблемах с изменением версии Groovy. Второй способ зависит от ОС, третий может быть неэффективным.

Есть ли что-то в Groovy, чтобы просто копировать файлы, как в 4-м операторе, или я должен просто использовать Java для него?

4b9b3361

Ответ 1

Если у вас есть Java 7, я бы определенно пошел с

Path source = ...
Path target = ...
Files.copy(source, target)

С классом java.nio.file.Path он может работать с символическими и жесткими ссылками. Из java.nio.file.Files:

Этот класс состоит исключительно из статических методов, которые работают файлы, каталоги или другие типы файлов. В большинстве случаев методы, определенные здесь , будут делегировать связанную файловую систему провайдер для выполнения файловых операций.

Как ссылки:

Скопировать файлы из одной папки в другую с помощью Groovy

http://groovyconsole.appspot.com/view.groovy?id=8001

Моим вторым вариантом была задача ant с AntBuilder.

Ответ 2

Если это текстовый файл, я бы пошел с:

  def src = new File('src.txt')
  def dst = new File('dst.txt')
  dst << src.text

Ответ 3

Если вы делаете это в коде, просто используйте что-то вроде:

new File('copy.bin').bytes = new File('orig.bin').bytes

Если это для кода, связанного с конструкцией, это также сработает или использует конструктор Ant.

Примечание. Если вы уверены, что файлы являются текстовыми, вы можете использовать .text, а не .bytes.

Ответ 4

Я использую AntBuilder для таких задач. Это простой, последовательный, "проверенный временем" и забавный.

Второй подход слишком специфичен для ОС (только для Linux)

3rd он слишком низкоуровневый, и он съедает больше ресурсов. Это полезно, если вам нужно преобразовать файл в путь: изменить кодировку, например

4-я выглядит сложнейшей для меня... Пакет NIO относительно новый в JDK.

В конце дня я бы пошел на 1-й вариант. Там вы можете переключиться с copy на scp, без повторной разработки script почти с нуля

Ответ 5

Чтобы добавить к существующему файлу:

def src = new File('src.txt')
def dest = new File('dest.txt')
dest << src.text

Чтобы перезаписать, если файл существует:

def src = new File('src.txt')
def dest = new File('dest.txt')
dest.write(src.text)

Ответ 6

Это способ использования независимой от платформы groovy script. Если у кого есть вопросы, задайте в комментариях.

def file = new File("java/jcifs-1.3.18.jar")
this.class.classLoader.rootLoader.addURL(file.toURI().toURL())

def auth_server = Class.forName("jcifs.smb.NtlmPasswordAuthentication").newInstance("domain", "username", "password")
def auth_local = Class.forName("jcifs.smb.NtlmPasswordAuthentication").newInstance(null, "local_username", "local_password")

def source_url = args[0]
def dest_url = args[1]
def auth = auth_server

//prepare source file
if(!source_url.startsWith("\\\\"))
{
  source_url = "\\\\localhost\\"+ source_url.substring(0, 1) + "\$" + source_url.substring(1, source_url.length());
  auth = auth_local  
}
source_url = "smb:"+source_url.replace("\\","/");
println("Copying from Source -> " + source_url);
println("Connecting to Source..");

def source = Class.forName("jcifs.smb.SmbFile").newInstance(source_url,auth)
println(source.canRead());


// Reset the authentication to default
auth = auth_server

//prepare destination file
if(!dest_url.startsWith("\\\\"))
{
  dest_url = "\\\\localhost\\"+ dest_url.substring(0, 1) + "\$" +dest_url.substring(2, dest_url.length());
  auth = auth_local  
}

def dest = null
dest_url = "smb:"+dest_url.replace("\\","/");
println("Copying To Destination-> " + dest_url);
println("Connecting to Destination..");

dest = Class.forName("jcifs.smb.SmbFile").newInstance(dest_url,auth)
println(dest.canWrite());

if (dest.exists()){
  println("Destination folder already exists");
}
source.copyTo(dest);

Ответ 7

Я предпочитаю этот способ:

def file = new File("old.file")
def newFile = new File("new.file")
Files.copy(file.toPath(), newFile.toPath())