web-dev-qa-db-fra.com

Comment copier des fichiers dans Groovy

J'ai besoin de copier un fichier dans Groovy et j'ai trouvé des moyens de le réaliser sur le Web: 

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

La 4ème manière me semble la plus propre car je ne sais pas à quel point il est bon d'utiliser AntBuilder et à quel point c'est lourd, j'ai vu certaines personnes signaler des problèmes liés au changement de version de Groovy. La deuxième voie dépend du système d’exploitation, la troisième peut ne pas être efficace. 

Y at-il quelque chose dans Groovy pour simplement copier des fichiers comme dans la 4ème instruction ou devrais-je simplement utiliser Java pour cela?

31
Roman Goyenko

Si vous avez Java 7, j'irais certainement avec

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

Avec la classe Java.nio.file.Path , il peut fonctionner avec des liens symboliques et physiques. De Java.nio.file.Files :

Cette classe comprend exclusivement des méthodes statiques qui opèrent sur fichiers, répertoires ou autres types de fichiers. Dans la plupart des cas, le méthodes définies ici déléguera au fournisseur de système de fichiers associé .__ pour effectuer les opérations sur les fichiers}.

Juste comme références:

Copier des fichiers d'un dossier à un autre avec Groovy

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

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

48
jalopaba

Si c'est un fichier texte, j'irais avec:

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

Si vous faites cela dans le code, utilisez quelque chose comme:

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

S'il s'agit d'un code lié à la construction, cela fonctionnerait également ou utiliserait le générateur Ant.

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

10
cjstehno

Pour ajouter au fichier existant:

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

Pour écraser si le fichier existe:

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

J'utilise AntBuilder pour de telles tâches. C'est simple, cohérent, «éprouvé au combat» et amusant. 

La 2ème approche est trop spécifique au système d'exploitation (Linux uniquement dans votre cas)

3ème c'est trop bas et il consomme plus de ressources. C'est utile si vous devez transformer le fichier en cours de route: changez l'encodage par exemple

4ème semble trop compliqué pour moi ... Le paquet NIO est relativement nouveau dans JDK.

En fin de journée, je choisirais la 1ère option. Là, vous pouvez passer de la tâche copy à la tâche scp sans re-développer le script presque à partir de zéro

4
injecteer

Je préfère cette façon:

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

C’est ainsi que nous utilisons un script groovy indépendant de la plateforme. Si quelqu'un a des questions s'il vous plaît 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