Make a backup file: Difference between revisions

Added FreeBASIC
(Added 11l)
(Added FreeBASIC)
 
(4 intermediate revisions by 4 users not shown)
Line 17:
{{trans|Python}}
 
<langsyntaxhighlight 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()</langsyntaxhighlight>
 
=={{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 36 ⟶ 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 56 ⟶ 133:
exit(0)
}
</syntaxhighlight>
</lang>
 
=={{header|Batch File}}==
<langsyntaxhighlight lang="dos">
@echo off
setlocal enabledelayedexpansion
Line 80 ⟶ 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 102 ⟶ 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 116 ⟶ 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 153 ⟶ 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 236 ⟶ 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 274 ⟶ 413:
}
}
}</langsyntaxhighlight>
 
Contents of 'original.txt' ''before'' the program is run and of 'original.txt.backup' ''after'' it is run:
Line 291 ⟶ 430:
 
{{works with|Java|1.5+}}
<langsyntaxhighlight lang="java5">import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
Line 320 ⟶ 459:
}
}
}</langsyntaxhighlight>
 
{{out}}
Line 328 ⟶ 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 356 ⟶ 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 373 ⟶ 512:
 
=={{header|Lasso}}==
<langsyntaxhighlight Lassolang="lasso">local(file2use = 'input.txt')
 
// create file
Line 392 ⟶ 531:
// create new file with new contents
local(nf = file(#file2use))
#nf->doWithClose => { #nf->writeBytes(#contents_of_f->asBytes) }</langsyntaxhighlight>
 
=={{header|Locomotive Basic}}==
Line 400 ⟶ 539:
=={{header|Nim}}==
In case the backup cannot be done, an exception is raised.
<langsyntaxhighlight Nimlang="nim">import os, strutils
 
const
Line 448 ⟶ 587:
# Cleanup.
setCurrentDir(oldDir)
removeDir(Dir)</langsyntaxhighlight>
 
{{out}}
Line 464 ⟶ 603:
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">use strict;
use warnings;
 
Line 503 ⟶ 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 517 ⟶ 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 524 ⟶ 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 544 ⟶ 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 553 ⟶ 692:
with filepath.open('w') as file:
file.write("New content")
</syntaxhighlight>
</lang>
 
=={{header|Racket}}==
Line 559 ⟶ 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 577 ⟶ 716:
 
(revise "fff")
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
Line 583 ⟶ 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 617 ⟶ 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 633 ⟶ 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 658 ⟶ 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 676 ⟶ 815:
end
 
1.upto(12) {|i| backup_and_open(ARGV[0]) {|fh| fh.puts "backup #{i}"}}</langsyntaxhighlight>
 
Example:
Line 714 ⟶ 853:
=={{header|Scala}}==
===Java Interoperability===
<langsyntaxhighlight Scalalang="scala">import java.io.{File, PrintWriter}
import java.nio.file.{Files, Paths, StandardCopyOption}
 
Line 736 ⟶ 875:
saveWithBackup("original.txt", "fourth", "fifth", "sixth")
 
}</langsyntaxhighlight>
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">package require Tcl 8.5
 
proc backupopen {filename mode} {
Line 760 ⟶ 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 780 ⟶ 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 802 ⟶ 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