如何在Groovy中复制文件

时间:2014-02-26 17:55:36

标签: 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))

第四种方式对我来说似乎最干净,因为我不确定使用AntBuilder有多好,有多重,我看到有些人报告了Groovy版本更改的问题。 第二种方式是依赖操作系统,第三种方式可能效率不高

Groovy中是否有东西可以像第4个语句那样复制文件,还是应该只使用Java?

8 个答案:

答案 0 :(得分:50)

如果你有Java 7,我肯定会选择

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

使用java.nio.file.Path类,它可以使用符号链接和硬链接。来自java.nio.file.Files

  

此类仅包含可在其上运行的静态方法   文件,目录或其他类型的文件。在大多数情况下,   此处定义的方法 将委托给关联的文件系统   提供商执行文件操作

就像参考:

Copy files from one folder to another with Groovy

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

我的第二个选项是使用ant的{​​{1}}任务。

答案 1 :(得分:12)

如果是文本文件,我会选择:

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

答案 2 :(得分:10)

如果您在代码中执行此操作,请使用以下内容:

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

如果这是与构建相关的代码,这也可以,或者使用Ant构建器。

注意,如果您确定文件是文字文件,则可以使用.text而不是.bytes

答案 3 :(得分: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)

答案 4 :(得分:4)

我正在使用AntBuilder执行此类任务。它简单,一致,“久经考验”且充满乐趣。

第二种方法太特定于操作系统(在您的情况下仅限Linux)

第三级太低级别,它会占用更多资源。如果你需要在途中转换文件,这很有用:例如改变编码

第4版对我来说过于复杂...... NIO包在JDK中相对较新。

在一天结束时,我会选择第一个选项。在那里,您可以从copy切换到scp任务,而无需从头开始重新开发脚本

答案 5 :(得分:2)

我更喜欢这种方式:

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

答案 6 :(得分:0)

这是使用独立于平台的groovy脚本的方式。如果有人有疑问,请在评论中提问。

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 :(得分:0)

用于在Jenkins Groovy中复制文件

对于Linux:

try {
	echo 'Copying the files to the required location'
	sh '''cd /install/opt/
	cp /install/opt/ssl.ks /var/local/system/'''					
	echo 'File is copied successfully'
}
catch(Exception e) {
	error 'Copying file was unsuccessful'
}



**For Windows:**
try {
	echo 'Copying the files to the required location'
	bat '''@echo off
	copy C:\\Program Files\\install\\opt\\ssl.ks C:\\ProgramData\\install\\opt'''				
	echo 'File is copied successfully'
}
catch(Exception e) {
	error 'Copying file was unsuccessful'
}