Difference between revisions of "Copy a file"

From CodeCodex

(add Ruby)
Line 1: Line 1:
 
==Implementations==
 
==Implementations==
 
===Java===
 
===Java===
<HIGHLIGHTSYNTAX language="java122">
+
<pre class="java">
 
     // Copies src file to dst file.
 
     // Copies src file to dst file.
 
     // If the dst file does not exist, it is created
 
     // If the dst file does not exist, it is created
Line 17: Line 17:
 
         out.close();
 
         out.close();
 
     }
 
     }
</HIGHLIGHTSYNTAX>
+
</pre>
 
* Original Source: [http://javaalmanac.com/egs/java.io/pkg.html?l=rel#Files The Java Developers Almanac 1.4]
 
* Original Source: [http://javaalmanac.com/egs/java.io/pkg.html?l=rel#Files The Java Developers Almanac 1.4]
  
 
Copies or moves a file without a loop.  Although I'm not sure, I believe using a FileChannel allows the OS to short-circuit the operation (without actually transferring the data through Java code).
 
Copies or moves a file without a loop.  Although I'm not sure, I believe using a FileChannel allows the OS to short-circuit the operation (without actually transferring the data through Java code).
  
<HIGHLIGHTSYNTAX language="java122">
+
<pre class="java">
 
     public void copy(File src, File dest, boolean move) throws Exception {
 
     public void copy(File src, File dest, boolean move) throws Exception {
 
// Create channel on the source
 
// Create channel on the source
Line 39: Line 39:
 
         if(move) src.delete();
 
         if(move) src.delete();
 
     }
 
     }
</HIGHLIGHTSYNTAX>
+
</pre>
  
 
===Perl===
 
===Perl===
<HIGHLIGHTSYNTAX language="perl">
+
<pre class="perl">
 
use File::Copy;
 
use File::Copy;
  
Line 50: Line 50:
 
# copy filehandle references
 
# copy filehandle references
 
copy($src, $dst) or die "Copy failed: $!";
 
copy($src, $dst) or die "Copy failed: $!";
</HIGHLIGHTSYNTAX>
+
</pre>
  
 
===Python===
 
===Python===
<HIGHLIGHTSYNTAX language="python">
+
<pre class="python">
 
import shutil
 
import shutil
  
Line 61: Line 61:
 
# copy file-objects
 
# copy file-objects
 
shutil.copyfileobj(src, dst)
 
shutil.copyfileobj(src, dst)
</HIGHLIGHTSYNTAX>
+
</pre>
 
+
  
 
===Ruby===
 
===Ruby===
<pre>
+
<pre class="ruby">
 
require 'fileutils'
 
require 'fileutils'
  

Revision as of 18:19, 19 January 2011

Implementations

Java

    // Copies src file to dst file.
    // If the dst file does not exist, it is created
    void copy(File src, File dst) throws IOException {
        InputStream in = new FileInputStream(src);
        OutputStream out = new FileOutputStream(dst);
    
        // Transfer bytes from in to out
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }
        in.close();
        out.close();
    }

Copies or moves a file without a loop. Although I'm not sure, I believe using a FileChannel allows the OS to short-circuit the operation (without actually transferring the data through Java code).

    public void copy(File src, File dest, boolean move) throws Exception {
	// Create channel on the source
        FileChannel srcChannel = new FileInputStream(src).getChannel();

    	// Create channel on the destination
    	FileChannel dstChannel = new FileOutputStream(dest).getChannel();
    
    	// Copy file contents from source to destination
	dstChannel.transferFrom(srcChannel, 0, srcChannel.size());
    
    	// Close the channels
	srcChannel.close();
        dstChannel.close();

        if(move) src.delete();	
    }

Perl

use File::Copy;

# copy files by name
copy('/path/to/file', '/path/to/other/phile') or die "Copy failed: $!";

# copy filehandle references
copy($src, $dst) or die "Copy failed: $!";

Python

import shutil

# copy files by name
shutil.copyfile('/path/to/file', '/path/to/other/phile')

# copy file-objects
shutil.copyfileobj(src, dst)

Ruby

require 'fileutils'

# copy files by name
src = '/path/to/file'
dst = '/path/to/other/phile'
FileUtils.copy src, dst

# copy file-objects
open(src, "r") do |f1|
  open(dst, "w") do |f2|
    FileUtils.copy_stream f1, f2
  end
end