Make a backup file: Difference between revisions

From Rosetta Code
Content added Content deleted
({{header|Common Lisp}})
(+Untested Java)
Line 23: Line 23:
(with-standard-io-syntax
(with-standard-io-syntax
(print data out)))))</lang>
(print data out)))))</lang>
=={{header|Java}}==
{{untested|Java}}
{{works with|Java|7+}}
<lang java5>import java.io.PrintWriter;
import java.io.FileWriter;
import java.nio.file.*;

public class Backup {
public static void saveWithBackup(String filename, String... data){
//toRealPath() follows symlinks to their ends
Path file = Paths.get(filename).toRealPath();
Path back = Paths.get(filename + ".backup").toRealPath();
Files.move(file, back, StandardCopyOption.REPLACE_EXISTING);
try(PrintWriter out = new PrintWriter(new FileWriter(file.toFile()))){
for(String datum:data){
out.println(datum);
}
}
}
}</lang>

Revision as of 15:48, 10 November 2011

Make a backup file is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

Before writing to a file it is often advisable to make a backup of the original. Creating such a backup file is however also not without pitfalls.

In this task you should create a backup file from an existing file and then write new text to the old file. The following issues should be handled:

  • avoid making a copy of the file but instead rename the original and then write a new file with the original filename
  • if a copy needs to be made, please explain why rename is not possible.
  • keep in mind symlinks, and do not rename or copy the link but the target.

(if there is a link foo -> bar/baz, then bar/baz should be renamed to bar/baz.backup and then the new text should be written to bar/baz)

  • it is assumed that you have permission to write in the target location, thus permission errors need not be handled.
  • you may choose the backup filename per preference or given limitations.(it should somehow include the original filename however)
  • please try to avoid executing external commands, and especially avoid calling a shell script.

Common Lisp

<lang lisp>(defun save-with-backup (filename data)

 (let ((file (probe-file filename)))
   (rename-file file (concatenate 'string (file-namestring file) ",1"))
   (with-open-file (out file
                        :direction :output
                        :if-exists :supersede)
     (with-standard-io-syntax
       (print data out)))))</lang>

Java

This example is untested. Please check that it's correct, debug it as necessary, and remove this message.


Works with: Java version 7+

<lang java5>import java.io.PrintWriter; import java.io.FileWriter; import java.nio.file.*;

public class Backup { public static void saveWithBackup(String filename, String... data){ //toRealPath() follows symlinks to their ends Path file = Paths.get(filename).toRealPath(); Path back = Paths.get(filename + ".backup").toRealPath(); Files.move(file, back, StandardCopyOption.REPLACE_EXISTING); try(PrintWriter out = new PrintWriter(new FileWriter(file.toFile()))){ for(String datum:data){ out.println(datum); } } } }</lang>