it-swarm.com.de

So kopieren Sie Dateien in Groovy

Ich muss eine Datei in Groovy kopieren und habe einige Möglichkeiten gesehen, um sie im Web zu erreichen: 

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

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

 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))

Der vierte Weg erscheint mir am saubersten, da ich nicht sicher bin, wie gut es ist, AntBuilder zu verwenden und wie schwer es ist. Der 2. Weg ist vom Betriebssystem abhängig, der 3. Weg ist möglicherweise nicht effizient. 

Gibt es in Groovy etwas, um nur Dateien wie in der 4. Anweisung zu kopieren, oder sollte ich einfach Java dafür verwenden?

31
Roman Goyenko

Wenn Sie Java 7 haben, würde ich definitiv mitgehen

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

Mit der Klasse Java.nio.file.Path kann es mit symbolischen und harten Links arbeiten. Von Java.nio.file.Files :

Diese Klasse besteht ausschließlich aus statischen Methoden, die mit .__ arbeiten. Dateien, Verzeichnisse oder andere Dateitypen. In den meisten Fällen ist der hier definierte Methoden wird an den zugeordneten Dateisystemanbieter __. delegiert, um die Dateioperationen auszuführen.

Nur als Referenzen:

Dateien mit Groovy von einem Ordner in einen anderen kopieren

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

Meine zweite Option wäre die ant-Task mit AntBuilder.

48
jalopaba

Wenn es eine Textdatei ist, würde ich mit gehen:

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

Wenn Sie dies im Code tun, verwenden Sie einfach etwas wie:

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

Wenn dies für Build-bezogenen Code ist, würde dies ebenfalls funktionieren oder den Ant-Builder verwenden.

Wenn Sie sicher sind, dass die Dateien Textdateien sind, können Sie .text anstelle von .bytes verwenden.

10
cjstehno

An vorhandene Datei anhängen:

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

Überschreiben, wenn Datei vorhanden ist:

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

Ich verwende AntBuilder für solche Aufgaben. Es ist einfach, konsistent, "erprobt" und macht Spaß. 

2. Ansatz ist zu betriebssystemspezifisch (nur Linux in Ihrem Fall)

3. Es ist zu niedrig und es verbraucht mehr Ressourcen. Dies ist nützlich, wenn Sie die Datei unterwegs umwandeln müssen: Ändern Sie beispielsweise die Codierung

4. sieht für mich zu kompliziert aus ... NIO-Paket ist relativ neu in JDK.

Am Ende des Tages würde ich die erste Option wählen. Dort können Sie von copy zu scp wechseln, ohne das Skript von Grund auf neu zu entwickeln

4
injecteer

Zum Kopieren von Dateien in Jenkins Groovy

Für 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'
}
0
randomguy

Ich bevorzuge diesen Weg:

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

Dies ist der Weg, der plattformunabhängiges Groovy-Skript verwendet. Wenn jemand Fragen hat, bitte in den Kommentaren nachfragen.

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);
0