Make a backup file: Difference between revisions

Added FreeBASIC
(Added FreeBASIC)
 
(5 intermediate revisions by 5 users not shown)
Line 14:
Some examples on this page assume that the original file already exists. They might fail if some user is trying to create a new file.
 
=={{header|11l}}==
{{trans|Python}}
 
<syntaxhighlight lang="11l">V targetfile = ‘pycon-china’
fs:rename(fs:path:canonical(targetfile), fs:path:canonical(targetfile)‘.bak’)
V f = File(fs:path:canonical(targetfile), ‘w’)
f.write(‘this task was solved during a talk about rosettacode at the PyCon China in 2011’)
f.close()</syntaxhighlight>
 
=={{header|Applesoft BASIC}}==
Due to all the pitfalls in this task it is helpful to turn on debugging by default. It is also helpful, to show each DOS 3.3 Command, by entering MON C before running the program. There is an extra PRINT statement in line 540 to work-around an issue with the display of DOS 3.3 commands after an error occurs. Setting ERASEANYBACKUP will delete the backup file if it already exists. Delete lines 180 to 230 with DEL 180,230 and it is possible with DOS 3.3 to have backup files all with the same name due to a pitfall in the RENAME Command.
<syntaxhighlight lang="gwbasic"> 100 ERASEANYBACKUP = FALSE
110 DEBUG = NOT FALSE
120 F$ = "FILE"
130 LET B$ = "BACKUP " + F$
140 LET D$ = CHR$ (4)
150 N$ = F$
160 GOSUB 400"FILE EXISTS?"
170 IF NOT E GOTO 260"MAKE NEW FILE"
180 N$ = B$
190 GOSUB 400"FILE EXISTS?"
200 IF NOT E GOTO 240"KEEP FILE AS BACKUP FILE"
210 IF DEBUG AND NOT ERASEANYBACKUP THEN PRINT " *** "B$" WON'T BE DELETED.";
220 IF NOT ERASEANYBACKUP THEN STOP
230 PRINT D$"DELETE "B$
 
240 IF DEBUG THEN PRINT " >>> MAKING A BACKUP FILE."
250 PRINT D$"RENAME "F$","B$
 
260 IF DEBUG THEN PRINT " >>> MAKING A NEW FILE."
270 PRINT D$"OPEN "F$
280 PRINT D$"WRITE "F$
290 PRINT "THE NEW CONTENT OF THE FILE."
300 PRINT D$"CLOSE "F$
310 END
 
400 ONERR GOTO 500"CATCH"
410 PRINT D$"VERIFY "N$
420 POKE 216,0: REM ONERR OFF
430 LET E = 1
440 IF DEBUG THEN PRINT " <<< "N$" EXISTS."
450 RETURN
500 LET E = PEEK (222) < > 6
510 POKE 216,0: REM ONERR OFF
520 IF E THEN RESUME : REM THROW
530 CALL - 3288: REM RECOVER
540 PRINT
550 IF DEBUG THEN PRINT " <<< "N$" DOES NOT EXIST."
560 RETURN</syntaxhighlight>
<syntaxhighlight lang="text">DELETE FILE
DELETE BACKUP FILE
MON C</syntaxhighlight>
<syntaxhighlight lang="gwbasic">RUN</syntaxhighlight>
{{out}}
<pre>
VERIFY FILE
<<< FILE DOES NOT EXIST.
>>> MAKING A NEW FILE.
OPEN FILE
WRITE FILE
CLOSE FILE
</pre>
<syntaxhighlight lang="gwbasic">RUN</syntaxhighlight>
{{out}}
<pre>
VERIFY FILE
<<< FILE EXISTS.
VERIFY BACKUP FILE
<<< BACKUP FILE DOES NOT EXIST.
>>> MAKING A BACKUP FILE.
RENAME FILE,BACKUP FILE
>>> MAKING A NEW FILE.
OPEN FILE
WRITE FILE
CLOSE FILE
</pre>
<syntaxhighlight lang="gwbasic">RUN</syntaxhighlight>
{{out}}
<pre>
VERIFY FILE
<<< FILE EXISTS.
VERIFY BACKUP FILE
<<< BACKUP FILE EXISTS.
*** BACKUP FILE WON'T BE DELETED.
BREAK IN 220
</pre>
=={{header|AutoHotkey}}==
<langsyntaxhighlight lang="autohotkey">targetfile := "ahk-file"
if FileExist(targetfile)
FileMove, %targetfile%, %targetfile%.bak
Line 27 ⟶ 113:
}
file.Write("This is a test string.`r`n")
file.Close()</langsyntaxhighlight>
 
=={{header|AWK}}==
<syntaxhighlight lang="awk">
<lang AWK>
# syntax: GAWK -f MAKE_A_BACKUP_FILE.AWK filename(s)
# see: http://www.gnu.org/software/gawk/manual/gawk.html#Extension-Sample-Inplace
Line 47 ⟶ 133:
exit(0)
}
</syntaxhighlight>
</lang>
 
=={{header|Batch File}}==
<langsyntaxhighlight lang="dos">
@echo off
setlocal enabledelayedexpansion
Line 71 ⟶ 157:
echo !line[1]!>"%filePath%"
for /l %%i in (2,1,%i%) do echo !line[%%i]!>>"%filePath%"
</syntaxhighlight>
</lang>
 
=={{header|Common Lisp}}==
Appends a version number and increments it on each backup
<langsyntaxhighlight lang="lisp">(defun parse-integer-quietly (&rest args)
(ignore-errors (apply #'parse-integer args)))
 
Line 93 ⟶ 179:
(rename-file file (get-next-version file))
(with-open-file (out file :direction :output)
(print data out))))</langsyntaxhighlight>
 
=={{header|Elixir}}==
<langsyntaxhighlight lang="elixir">defmodule RC do
def backup_file(filename) do
backup = filename <> ".backup"
Line 107 ⟶ 193:
end
 
hd(System.argv) |> RC.backup_file</langsyntaxhighlight>
 
=={{header|Forth}}==
<syntaxhighlight lang="forth">
: backup ( addr u -- )
2dup pad place s" .bak" pad +place
2dup pad count rename-file throw
w/o create-file throw
s" This is a test string." 2 pick write-file throw
close-file throw ;
 
s" testfile" backup</syntaxhighlight>
 
=={{header|FreeBASIC}}==
<syntaxhighlight lang="vbnet">Sub saveWithBackup(filePath As String, lines() As String)
Dim As String origPath = filePath
If Len(Dir(origPath)) > 0 Then
Dim As String backupPath = origPath & ".backup"
Name(origPath, backupPath) 'Renames a file on disk
End If
Open origPath For Output As #1
For i As Integer = 1 To Ubound(lines)
Print #1, lines(i)
Next i
Close #1
End Sub
 
Dim lines(1 To 3) As String => {"fourth", "fifth", "sixth"}
saveWithBackup("original.txt", lines())
 
Dim As String linea
' check it worked
Print "Current contents of original.txt:"
Open "original.txt" For Input As #1
While Not Eof(1)
Line Input #1, linea
Print linea
Wend
Close #1
 
Print !"\nContents of original.txt.backup:"
Open "original.txt.backup" For Input As #1
While Not Eof(1)
Line Input #1, linea
Print linea
Wend
Close #1
 
Sleep</syntaxhighlight>
{{out}}
Contents of 'original.txt' ''before'' the program is run and of 'original.txt.backup' ''after'' it is run:
<pre>
first
second
third
</pre>
 
Contents of 'original.txt' ''after'' the program is run:
<pre>
fourth
fifth
sixth
</pre>
 
=={{header|Go}}==
===Rename===
This is the technique of the task description.
<langsyntaxhighlight lang="go">package main
 
import (
Line 144 ⟶ 292:
fmt.Println(err)
}
}</langsyntaxhighlight>
===Copy===
Alternative technique copies an existing file to make the backup copy, then updates the origial file. In an attempt to keep operations atomic, the original file is opened as the first operation and is not closed until all operations are complete. In an attempt to avoid data loss, the original file is not modified until the backup file is closed.
<langsyntaxhighlight lang="go">package main
 
import (
Line 227 ⟶ 375:
// backup complete (as long as err == nil)
return
}</langsyntaxhighlight>
 
=={{header|Java}}==
{{works with|Java|7+}}
<langsyntaxhighlight lang="java5">import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
Line 265 ⟶ 413:
}
}
}</langsyntaxhighlight>
 
Contents of 'original.txt' ''before'' the program is run and of 'original.txt.backup' ''after'' it is run:
Line 282 ⟶ 430:
 
{{works with|Java|1.5+}}
<langsyntaxhighlight lang="java5">import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
Line 311 ⟶ 459:
}
}
}</langsyntaxhighlight>
 
{{out}}
Line 319 ⟶ 467:
{{works with|Julia|0.6}}
 
<langsyntaxhighlight lang="julia">targetfile = "pycon-china"
mv(realpath(targetfile), realpath(targetfile) * ".bak")
# "a+" for permissions of reading, writing, creating
open(targetfile, "w+") do io
println(io, "this task was solved during a talk about rosettacode at the PyCon China in 2011")
end</langsyntaxhighlight>
 
=={{header|Kotlin}}==
{{trans|Java}}
<langsyntaxhighlight lang="scala">// version 1.1.51
 
import java.io.File
Line 347 ⟶ 495:
fun main(args: Array<String>) {
saveWithBackup("original.txt", "fourth", "fifth", "sixth")
}</langsyntaxhighlight>
 
Contents of 'original.txt' ''before'' the program is run and of 'original.txt.backup' ''after'' it is run:
Line 364 ⟶ 512:
 
=={{header|Lasso}}==
<langsyntaxhighlight Lassolang="lasso">local(file2use = 'input.txt')
 
// create file
Line 383 ⟶ 531:
// create new file with new contents
local(nf = file(#file2use))
#nf->doWithClose => { #nf->writeBytes(#contents_of_f->asBytes) }</langsyntaxhighlight>
 
=={{header|Locomotive Basic}}==
Line 391 ⟶ 539:
=={{header|Nim}}==
In case the backup cannot be done, an exception is raised.
<langsyntaxhighlight Nimlang="nim">import os, strutils
 
const
Line 439 ⟶ 587:
# Cleanup.
setCurrentDir(oldDir)
removeDir(Dir)</langsyntaxhighlight>
 
{{out}}
Line 455 ⟶ 603:
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">use strict;
use warnings;
 
Line 494 ⟶ 642:
 
# back up this program
backup($0,3,'.bk');</langsyntaxhighlight>
 
=={{header|Phix}}==
{{trans|Go}}
<langsyntaxhighlight Phixlang="phix">targetfile = get_proper_path("test.txt")
if not rename_file(targetfile, targetfile&".bak", overwrite:=true) then
puts(1,"warning: could not rename file\n")
Line 508 ⟶ 656:
puts(fn,"this task was translated from the Python entry\n")
close(fn)
end if</langsyntaxhighlight>
Before basing anything on the above code, though, I would recommend you take a look at <br>
function saveFile in demo\edix\edix.exw, which does this sort of thing for real: <br>
Line 515 ⟶ 663:
=={{header|PicoLisp}}==
PicoLisp makes use of external commands as much as possible (at least for not time-critical operations), to avoid duplicated functionality.
<langsyntaxhighlight PicoLisplang="picolisp">(let Path (in '(realpath "foo") (line T))
(call 'mv Path (pack Path ".backup"))
(out Path
(prinl "This is the new file") ) )</langsyntaxhighlight>
 
=={{header|Pike}}==
<langsyntaxhighlight Pikelang="pike">string targetfile = "pycon-china";
targetfile = System.resolvepath(targetfile);
mv(targetfile, targetfile+"~");
Stdio.write_file(targetfile, "this task was solved at the pycon china 2011");</langsyntaxhighlight>
 
=={{header|Python}}==
Using [https://docs.python.org/library/os.html os library]
<syntaxhighlight lang="python">
<lang Python>
import os
targetfile = "pycon-china"
Line 535 ⟶ 683:
f.write("this task was solved during a talk about rosettacode at the PyCon China in 2011")
f.close()
</syntaxhighlight>
</lang>
Or using a newer [https://docs.python.org/library/pathlib.html pathlib library] (Python >= 3.4):
<syntaxhighlight lang="python">
<lang Python>
from pathlib import Path
 
Line 544 ⟶ 692:
with filepath.open('w') as file:
file.write("New content")
</syntaxhighlight>
</lang>
 
=={{header|Racket}}==
Line 550 ⟶ 698:
This version keeps unlimited backups, with <tt>*.bak</tt> being the freshest one, <tt>*.bak1</tt> is an older backup, etc. So each backup moves all existing names up.
 
<syntaxhighlight lang="racket">
<lang Racket>
#lang racket
 
Line 568 ⟶ 716:
 
(revise "fff")
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
Line 574 ⟶ 722:
{{works with|Rakudo|2017.10}}
 
<syntaxhighlight lang="raku" perl6line># Back up the given path/filename with a default extension .bk(n)
# where n is in the range 1 - $limit (default 3).
# Prints 'File not found' to STDERR if the file does not exist.
Line 608 ⟶ 756:
# Optionally, specify limit, back-up extension pattern and whether to follow symlinks.
# Optional parameters can be in any order, in any combination.
backup 'myfile', :follow-symlinks, :limit(2), :ext('bak');</langsyntaxhighlight>
 
=={{header|REXX}}==
This REXX version executes under DOS or DOS under Windows.
<langsyntaxhighlight lang="rexx">/*REXX program creates a backup file (for a given file), then overwrites the old file.*/
parse arg oFID . /*get a required argument from the C.L.*/
if oFID=='' then do /*No argument? Then issue an err msg.*/
Line 624 ⟶ 772:
'RENAME' oFID tFID /*rename the original file to backup. */
call lineout oFID, '═══This is line 1.' /*write one line to the original file. */
/*stick a fork in it, we're all done. */</langsyntaxhighlight>
The contents of the original file (before execution): &nbsp; '''A.FILE''':
<pre>
Line 649 ⟶ 797:
=={{header|Ruby}}==
This version does not overwrite the backup file if it exists.
<langsyntaxhighlight lang="ruby">def backup_and_open(filename)
filename = File.realpath(filename)
bkup = filename + ".backup"
Line 667 ⟶ 815:
end
 
1.upto(12) {|i| backup_and_open(ARGV[0]) {|fh| fh.puts "backup #{i}"}}</langsyntaxhighlight>
 
Example:
Line 705 ⟶ 853:
=={{header|Scala}}==
===Java Interoperability===
<langsyntaxhighlight Scalalang="scala">import java.io.{File, PrintWriter}
import java.nio.file.{Files, Paths, StandardCopyOption}
 
Line 727 ⟶ 875:
saveWithBackup("original.txt", "fourth", "fifth", "sixth")
 
}</langsyntaxhighlight>
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">package require Tcl 8.5
 
proc backupopen {filename mode} {
Line 751 ⟶ 899:
}
return [open $filename $mode]
}</langsyntaxhighlight>
 
=={{header|VBA}}==
<langsyntaxhighlight lang="vb">Public Sub backup(filename As String)
If Len(Dir(filename)) > 0 Then
On Error Resume Next
Line 771 ⟶ 919:
Public Sub main()
backup "D:\test.txt"
End Sub</langsyntaxhighlight>
 
=={{header|Wren}}==
{{libheader|Wren-ioutil}}
<langsyntaxhighlight ecmascriptlang="wren">import "./ioutil" for File, FileUtil
 
var saveWithBackup = Fn.new { |filePath, lines|
Line 793 ⟶ 941:
System.print(File.read("original.txt"))
System.print("Contents of original.txt.backup:")
System.print(File.read("original.txt.backup"))</langsyntaxhighlight>
 
{{out}}
2,170

edits