Comment copier des fichiers dans Groovy

j'ai besoin de copier un fichier dans Groovy et j'ai vu quelques façons de le réaliser sur le web:

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

la 4ème voie me semble la plus propre car je ne suis pas sûr à quel point il est bon d'utiliser AntBuilder et à quel point il est lourd, j'ai vu certaines personnes rapportant des problèmes avec Groovy changement de version. 2nd way est dépendant de L'OS, 3rd pourrait ne pas être efficace.

est-ce Qu'il y a quelque chose dans Groovy pour simplement copier des fichiers comme dans la 4ème déclaration ou devrais-je simplement utiliser Java pour cela?

26
demandé sur Matthias Braun 2014-02-26 21:55:35

7 réponses

si vous avez Java 7, je dirais certainement

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

avec le java.nio.fichier.Chemin classe, il peut travailler avec des liens symboliques et durs. De java.nio.fichier.Fichiers :

la présente classe ne couvre que les procédés statiques qui fonctionnent fichiers, répertoires ou autres types de fichiers. Dans la plupart des cas, la méthodes définies ici déléguera vers le système de fichiers associé fournisseur pour effectuer les opérations de fichier .

comme références:

copier des fichiers d'un dossier à L'autre avec Groovy

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

ma deuxième option serait la tâche ant avec AntBuilder .

43
répondu jalopaba 2017-05-23 12:18:21

si vous faites cela en code, utilisez juste quelque chose comme:

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

si c'est pour le code de construction, cela fonctionnerait aussi, ou utiliser le constructeur de fourmis.

Note, Si vous êtes sûr que les fichiers sont textuels, vous pouvez utiliser .text plutôt que .bytes .

10
répondu cjstehno 2014-02-26 18:29:05

S'il s'agit d'un fichier texte, je dirais:

  def src = new File('src.txt')
  def dst = new File('dst.txt')
  dst << src.text
10
répondu jdevora 2015-09-02 09:21:23

j'utilise AntBuilder pour ces tâches. C'est simple, cohérent, 'battle-proven' et amusant.

la 2ème approche est trop spécifique aux OS (Linux-seulement dans votre cas)

3e il trop bas niveau et il mange de plus de ressources. Il est utile si vous avez besoin de transformer le fichier sur le chemin: changer l'encodage par exemple

la 4ème me semble surmontée... Le paquet NIO est relativement nouveau dans JDK.

À la fin de le jour, j'opterais pour la 1ère option. Là, vous pouvez passer de copy à scp tâche, sans développer le script presque à partir de zéro

4
répondu injecteer 2014-02-26 18:27:23

à ajouter au fichier existant:

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

À remplacer si le fichier existe :

def src = new File('src.txt')
def dest = new File('dest.txt')
dest.write(src.text)
4
répondu Sahil Chhabra 2017-04-24 08:54:55

c'est la façon d'utiliser le groovy script indépendant de plate-forme. Si quelqu'un a des questions, veuillez demander dans les commentaires.

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
répondu Nayana Adassuriya 2016-11-01 09:49:34

je préfère de cette façon:

def file = new File("old.file")
def newFile = new File("new.file")
Files.copy(file.toPath(), newFile.toPath())
0
répondu lepe 2017-12-02 03:51:33