我需要在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?
答案 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'
}