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?
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
.
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
.
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
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
à 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)
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);
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())