Rename a file
![Task](http://static.miraheze.org/rosettacodewiki/thumb/b/ba/Rcode-button-task-crushed.png/64px-Rcode-button-task-crushed.png)
You are encouraged to solve this task according to the task description, using any language you may know.
In this task, the job is to rename the file called "input.txt" into "output.txt" and a directory called "docs" into "mydocs". This should be done twice: once "here", i.e. in the current working directory and once in the filesystem root.
Ada
<lang ada>with Ada.Directories; use Ada.Directories;
...
Rename ("input.txt", "output.txt"); Rename ("docs", "mydocs"); Rename ("/input.txt", "/output.txt"); Rename ("/docs", "/mydocs");</lang> The behavior depends on the concrete operating system regarding:
- file name encoding issues;
- file path notation (directory separator, directory syntax etc);
- file extension syntax;
- file system root (provided there is any).
ALGOL 68
Note: reidf does not appear to be included in ALGOL 68G. Also note that file names would be Operating System dependent. <lang algol68>main:(
PROC rename = (STRING source name, dest name)INT: BEGIN FILE actual file; INT errno = open(actual file, source name, stand back channel); IF errno NE 0 THEN errno ELSE IF reidf possible(actual file) THEN reidf(actual file, dest name); # change the identification of the book # errno ELSE close(actual file); -1 FI FI END; rename("input.txt", "output.txt"); rename("/input.txt", "/output.txt"); rename("docs", "mydocs"); rename("/docs", "/mydocs")
)</lang>
AWK
Awk allows to call operating system commands with the system() function. However, the awk script won't get its output, only the return code. But this task is simple enough for the trivial implementation to work: <lang awk>$ awk 'BEGIN{system("mv input.txt output.txt")}' $ awk 'BEGIN{system("mv docs mydocs")}' $ awk 'BEGIN{system("mv /input.txt /output.txt")}' $ awk 'BEGIN{system("mv docs mydocs")}'</lang>
AutoHotkey
<lang AutoHotkey>FileMove, oldname, newname</lang>
BASIC
<lang qbasic>NAME "input.txt" AS "output.txt" NAME "\input.txt" AS "\output.txt" NAME "docs" AS "mydocs" NAME "\docs" AS "\mydocs"</lang>
Applesoft BASIC
Apple DOS 3.3 has a flat filesystem with no concept of directories. DOS commands such as RENAME are run directly from the Applesoft prompt but are not technically part of Applesoft BASIC. Thus, attempting to add this line to a program and run it results in a syntax error on that line.
<lang basic>RENAME INPUT.TXT,OUTPUT.TXT</lang>
Apple ProDOS does have directories, but this example has yet to be written.
ZX Spectrum Basic
The ZX Spectrum basic does not not have a facility to rename a file on the microdrive. To rename a file, it is necessary to delete the file and recreate it. Alternatively, a machine code program can be used to achieve this.
Batch File
<lang dos>ren input.txt output.txt ren \input.txt output.txt ren docs mydocs ren \docs mydocs</lang>
BBC BASIC
When the file or directory names are known as constants at 'compile time': <lang bbcbasic> *RENAME input.txt output.txt
*RENAME \input.txt \output.txt *RENAME docs. mydocs. *RENAME \docs. \mydocs.</lang>
When the file or directory names are known only at run time: <lang bbcbasic> OSCLI "RENAME input.txt output.txt"
OSCLI "RENAME \input.txt \output.txt" OSCLI "RENAME docs. mydocs." OSCLI "RENAME \docs. \mydocs."</lang>
C
<lang c>#include <stdio.h>
int main() {
rename("input.txt", "output.txt"); rename("docs", "mydocs"); rename("/input.txt", "/output.txt"); rename("/docs", "/mydocs"); return 0;
}</lang>
C++
<lang cpp>#include <cstdio>
int main() {
std::rename("input.txt", "output.txt"); std::rename("docs", "mydocs"); std::rename("/input.txt", "/output.txt"); std::rename("/docs", "/mydocs"); return 0;
}</lang>
compiled with g++ -lboost_system -lboost_filesystem
<lang cpp>#include "boost/filesystem.hpp"
int main() {
boost::filesystem::rename( boost::filesystem::path("input.txt"), boost::filesystem::path("output.txt")); boost::filesystem::rename( boost::filesystem::path("docs"), boost::filesystem::path("mydocs")); boost::filesystem::rename( boost::filesystem::path("/input.txt"), boost::filesystem::path("/output.txt")); boost::filesystem::rename( boost::filesystem::path("/docs"), boost::filesystem::path("/mydocs"));*/ return 0;
}</lang>
C#
<lang csharp>using System; using System.IO;
class Program {
static void Main(string[] args) { File.Move("input.txt","output.txt"); File.Move(@"\input.txt",@"\output.txt");
Directory.Move("docs","mydocs"); Directory.Move(@"\docs",@"\mydocs"); }
}</lang>
Clojure
<lang clojure>(import '(java.io File))
(.renameTo (File. "input.txt") (File. "output.txt")) (.renameTo (File. "docs") (File. "mydocs"))
(.renameTo
(File. (str (File/separator) "input.txt")) (File. (str (File/separator) "output.txt")))
(.renameTo
(File. (str (File/separator) "docs")) (File. (str (File/separator) "mydocs")))</lang>
Common Lisp
<lang lisp>(rename-file "input.txt" "output.txt") (rename-file "docs" "mydocs") (rename-file "/input.txt" "/output.txt") (rename-file "/docs" "/mydocs")</lang>
D
<lang d>std.file.rename("input.txt","output.txt"); std.file.rename("/input.txt","/output.txt"); std.file.rename("docs","mydocs"); std.file.rename("/docs","/mydocs");</lang>
DCL
<lang DCL>rename input.txt output.txt rename docs.dir mydocs.dir rename [000000]input.txt [000000]output.txt rename [000000]docs.dir [000000]mydocs.dir</lang>
Delphi
<lang Delphi>program RenameFile;
{$APPTYPE CONSOLE}
uses SysUtils;
begin
SysUtils.RenameFile('input.txt', 'output.txt'); SysUtils.RenameFile('\input.txt', '\output.txt');
// RenameFile works for both files and folders SysUtils.RenameFile('docs', 'MyDocs'); SysUtils.RenameFile('\docs', '\MyDocs');
end.</lang>
E
<lang e>for where in [<file:.>, <file:///>] {
where["input.txt"].renameTo(where["output.txt"], null) where["docs"].renameTo(where["mydocs"], null)
}</lang>
Factor
<lang factor>"" "/" [
[ "input.txt" "output.txt" move-file "docs" "mydocs" move-file ] with-directory
] bi@</lang>
Fantom
<lang fantom> class Rename {
public static Void main () { // rename file/dir in current directory File.rename("input.txt".toUri).rename("output.txt") File.rename("docs/".toUri).rename("mydocs/") // rename file/dir in root directory File.rename("/input.txt".toUri).rename("/output.txt") File.rename("/docs/".toUri).rename("/mydocs/") }
} </lang>
Forth
<lang forth> s" input.txt" s" output.txt" rename-file throw s" /input.txt" s" /output.txt" rename-file throw</lang>
Fortran
Using UNIX extensions to Fortran 77 (see e.g. g77 manual) : <lang fortran> PROGRAM EX_RENAME
CALL RENAME('input.txt','output.txt') CALL RENAME('docs','mydocs') CALL RENAME('/input.txt','/output.txt') CALL RENAME('/docs','/mydocs') END</lang>
Go
<lang go>package main import "os"
func main() {
os.Rename("input.txt", "output.txt") os.Rename("docs", "mydocs") os.Rename("/input.txt", "/output.txt") os.Rename("/docs", "/mydocs")
}</lang>
Groovy
Using File <lang groovy>['input.txt':'output.txt', 'docs':'mydocs'].each { src, dst ->
['.', ].each { dir -> new File("$dir/$src").renameTo(new File("$dir/$dst")) }
}</lang>
Using Ant <lang groovy>['input.txt':'output.txt', 'docs':'mydocs'].each { src, dst ->
['.', ].each { dir -> new AntBuilder().move(file:"$dir/$src", toFile:"$dir/$dst") }
}</lang>
Haskell
<lang haskell>import System.IO import System.Directory
main = do
renameFile "input.txt" "output.txt" renameDirectory "docs" "mydocs" renameFile "/input.txt" "/output.txt" renameDirectory "/docs" "/mydocs"</lang>
HicEst
<lang hicest>WRITE(FIle='input.txt', REName='.\output.txt') SYSTEM(DIR='E:\HicEst\Rosetta') WRITE(FIle='.\docs', REName='.\mydocs')
WRITE(FIle='\input.txt', REName='\output.txt') SYSTEM(DIR='\') WRITE(FIle='\docs', REName='\mydocs') </lang>
Icon and Unicon
Icon supports 'rename' for files only. <lang Unicon>every dir := !["./","/"] do {
rename(f := dir || "input.txt", dir || "output.txt") |stop("failure for file rename ",f) rename(f := dir || "docs", dir || "mydocs") |stop("failure for directory rename ",f) }</lang>
Note: Icon and Unicon accept both / and \ for directory separators.
J
J does not ship with a built-in utility for renaming files. The following will work on Windows, Linux and Macs:
<lang j>frename=: 4 : 0
if. x -: y do. return. end. if. IFUNIX do. hostcmd=. [: 2!:0 '('"_ , ] , ' || true)'"_ hostcmd 'mv "',y,'" "',x,'"' else. 'kernel32 MoveFileA i *c *c' 15!:0 y;x end.
)</lang>
Useage: <lang j>'output.txt' frename 'input.txt' '/output.txt' frename '/input.txt' 'mydocs' frename 'docs' '/mydocs' frename '/docs'</lang>
Java
<lang java>import java.util.File; public class FileRenameTest {
public static boolean renameFile(String oldname, String newname) { // File (or directory) with old name File file = new File(oldname); // File (or directory) with new name File file2 = new File(newname); // Rename file (or directory) boolean success = file.renameTo(file2); return success; } public static void test(String type, String oldname, String newname) { System.out.println("The following " + type + " called " + oldname + ( renameFile(oldname, newname) ? " was renamed as " : " could not be renamed into ") + newname + "." ); } public static void main(String args[]) { test("file", "input.txt", "output.txt"); test("file", File.separator + "input.txt", File.separator + "output.txt"); test("directory", "docs", "mydocs"); test("directory", File.separator + "docs" + File.separator, File.separator + "mydocs" + File.separator); }
}</lang>
JavaScript
Throws an error if the destination file/folder exists. <lang javascript>var fso = new ActiveXObject("Scripting.FileSystemObject"); fso.MoveFile('input.txt', 'output.txt'); fso.MoveFile('c:/input.txt', 'c:/output.txt'); fso.MoveFolder('docs', 'mydocs'); fso.MoveFolder('c:/docs', 'c:/mydocs');</lang>
Liberty BASIC
<lang lb>' LB has inbuilt 'name' command, but can also run batch files
nomainwin
name "input.txt" as "output.txt" run "cmd.exe /c ren docs mydocs", HIDE name "C:\input.txt" as "C:\output.txt" run "cmd.exe /c ren C:\docs mydocs", HIDE
end</lang>
Lua
<lang lua>os.rename( "input.txt", "output.txt" ) os.rename( "/input.txt", "/output.txt" ) os.rename( "docs", "mydocs" ) os.rename( "/docs", "/mydocs" )</lang>
Mathematica
<lang Mathematica>SetDirectory[NotebookDirectory[]] RenameFile["input.txt", "output.txt"] RenameDirectory["docs", "mydocs"] SetDirectory[$RootDirectory] RenameFile["input.txt", "output.txt"] RenameDirectory["docs", "mydocs"]</lang>
MAXScript
MAXScript has no folder rename method <lang maxscript>-- Here renameFile "input.txt" "output.txt" -- Root renameFile "/input.txt" "/output.txt"</lang>
MUMPS
ANSI MUMPS doesn't allow access to the operating system except possibly through the View command and $View function, both of which are implementation specific. Intersystems' Caché does allow you to create processes with the $ZF function, and if the permissions for the Caché process allow it you can perform operating system commands.
In Cache on OpenVMS in an FILES-11 filesystem ODS-5 mode these could work:
<lang MUMPS> ;Local
S X=$ZF(-1,"rename input.txt output.txt") S X=$ZF(-1,"rename docs.dir mydocs.dir") ;Root of current device S X=$ZF(-1,"rename [000000]input.txt [000000]output.txt") S X=$ZF(-1,"rename [000000]docs.dir [000000]mydocs.dir")</lang>
Objective-C
<lang objc>NSFileManager *fm = [NSFileManager defaultManager];
// Pre-OS X 10.5 [fm movePath:@"input.txt" toPath:@"output.txt" handler:nil]; [fm movePath:@"docs" toPath:@"mydocs" handler:nil];
// OS X 10.5+ [fm moveItemAtPath:@"input.txt" toPath:@"output.txt" error:NULL]; [fm moveItemAtPath:@"docs" toPath:@"mydocs" error:NULL];</lang>
Objeck
<lang objeck> use IO; bundle Default {
class FileExample { function : Main(args : String[]) ~ Nil { File->Rename("input.txt", "output.txt"); File->Rename("docs", "mydocs"); File->Rename("/input.txt", "/output.txt"); File->Rename("/docs", "/mydocs"); } }
} </lang>
OCaml
<lang ocaml>Sys.rename "input.txt" "output.txt";; Sys.rename "docs" "mydocs";; Sys.rename "/input.txt" "/output.txt";; Sys.rename "/docs" "/mydocs";;</lang>
Octave
<lang octave> rename('docs','mydocs'); rename('input.txt','/output.txt'); rename('/docs','/mydocs'); </lang>
Openedge/Progress
<lang Progress (OpenEdge ABL)>OS-RENAME "input.txt" "output.txt". OS-RENAME "docs" "mydocs".
OS-RENAME "/input.txt" "/output.txt". OS-RENAME "/docs" "/mydocs".</lang>
PARI/GP
GP has no built-in facilities for renaming, but can use a system call: <lang parigp>system("mv input.txt output.txt"); system("mv /input.txt /output.txt"); system("mv docs mydocs"); system("mv /docs /mydocs");</lang> PARI, as usual, has access to all the standard C methods.
Pascal
<lang pascal> var
f : file ; // Untyped file begin // as current directory AssignFile(f,'input.doc'); Rename(f,'output.doc'); // as root directory AssignFile(f,'\input.doc'); Rename(f,'\output.doc'); // rename a directory AssignFile(f,'docs'); Rename(f,'mydocs'); //rename a directory off the root AssignFile(f,'\docs'); Rename(f,'\mydocs');
end;</lang>
Perl
<lang perl>use File::Copy qw(move); use File::Spec::Functions qw(catfile rootdir);
- here
move 'input.txt', 'output.txt'; move 'docs', 'mydocs';
- root dir
move (catfile rootdir, 'input.txt'), (catfile rootdir, 'output.txt'); move (catfile rootdir, 'docs'), (catfile rootdir, 'mydocs');</lang>
PHP
<lang php><?php rename('input.txt', 'output.txt'); rename('docs', 'mydocs'); rename('/input.txt', '/output.txt'); rename('/docs', '/mydocs'); ?></lang>
PicoLisp
<lang PicoLisp>(call 'mv "input.txt" "output.txt") (call 'mv "docs" "mydocs") (call 'mv "/input.txt" "/output.txt") (call 'mv "/docs" "/mydocs")</lang>
Pike
<lang pike>int main(){
mv("input.txt", "output.txt"); mv("/input.txt", "/output.txt"); mv("docs", "mydocs"); mv("/docs", "/mydocs");
}</lang>
Pop11
<lang pop11>sys_file_move('inputs.txt', 'output.txt'); sys_file_move('docs', 'mydocs'); sys_file_move('/inputs.txt', '/output.txt'); sys_file_move(/'docs', '/mydocs');</lang>
Note that notion of the root of filesystem is Unix specific, so above we do not try to suport other systems.
PowerShell
<lang powershell>Rename-Item input.txt output.txt
- The Rename-item has the alias ren
ren input.txt output.txt</lang>
PureBasic
<lang purebasic>RenameFile("input.txt", "output.txt") RenameFile("docs\", "mydocs\")
RenameFile("/input.txt","/output.txt") RenameFile("/docs\","/mydocs\")</lang>
Python
<lang python>import os
os.rename("input.txt", "output.txt") os.rename("docs", "mydocs")
os.rename(os.sep + "input.txt", os.sep + "output.txt") os.rename(os.sep + "docs", os.sep + "mydocs")</lang>
R
<lang R>file.rename("input.txt", "output.txt") file.rename("/input.txt", "/output.txt") file.rename("docs", "mydocs") file.rename("/docs", "/mydocs")</lang>
REALbasic
This should work regardless of what OS it's running under (but untested under Mac OS).
<lang vb>Sub Renamer()
Dim f As FolderItem, r As FolderItem
f = GetFolderItem("input.txt") 'Changing a FolderItem's Name attribute renames the file or directory. If f.Exists Then f.Name = "output.txt" 'Files and directories are handled almost identically in RB. f = GetFolderItem("docs") If f.Exists Then f.Name = "mydocs"
'Jump through hoops to find the root directory. r = RootDir(GetFolderItem("."))
f = r.Child("input.txt") 'Renaming in a different directory identical to renaming in current directory. If f.Exists Then f.Name = "output.txt" f = r.Child("docs") If f.Exists Then f.Name = "mydocs"
End Sub
Function RootDir(what As FolderItem) As FolderItem
'RB doesn't have an easy way to find the root of the current drive; 'not an issue under *nix but troublesome under Windows. If what.Parent <> Nil Then 'Nil = no parent = root. Return RootDir(what.Parent) 'Recursive. Else Return what End If
End Function</lang>
REBOL
<lang REBOL>rename %input.txt %output.txt rename %docs/ %mydocs/
- Unix. Note that there's no path specification used for the
- new name. "Rename" is not "move".
rename %/input.txt %output.txt rename %/docs/ %mydocs/
- DOS/Windows
rename %/c/input.txt %output.txt rename %/c/docs/ %mydocs/
- Because REBOL treats data access schemes as uniformly as possible,
- you can do tricks like this
rename ftp://username:password@ftp.site.com/www/input.txt %output.txt rename ftp://username:password@ftp.site.com/www/docs/ %mydocs/ </lang>
REXX
version 1
<lang rexx> do 2
'RENAME' "input.txt" "output.txt" 'CD' "\" 'MOVE' "\docs" "\mydocs" end</lang>
version 2
<lang rexx> do 2
'RENAME' "input.txt output.txt" 'CD' "\" 'MOVE' "\docs \mydocs" end</lang>
Ruby
<lang ruby>File.rename('input.txt', 'output.txt') File.rename('/input.txt', '/output.txt') File.rename('docs', 'mydocs') File.rename('/docs', '/mydocs')</lang>
The FileUtils#move method has some more flexibility than the core File#rename method (not really demonstrated here).
<lang ruby>require 'fileutils' moves = { "input.txt" => "output.txt", "/input.txt" => "/output.txt", "docs" => "mydocs","/docs" => "/mydocs"} moves.each{ |src, dest| FileUtils.move( src, dest, :verbose => true ) }</lang>
Scheme
<lang scheme>(rename-file "input.txt" "output.txt") (rename-file "docs" "mydocs") (rename-file "/input.txt" "/output.txt") (rename-file "/docs" "/mydocs")</lang>
Seed7
<lang seed7>$ include "seed7_05.s7i";
const proc: main is func
begin moveFile("input.txt", "output.txt"); moveFile("docs", "mydocs"); moveFile("/input.txt", "/output.txt"); moveFile("/docs", "/mydocs"); end func;</lang>
Slate
<lang slate>(File newNamed: 'input.txt') renameTo: 'output.txt'. (File newNamed: '/input.txt') renameTo: '/output.txt'. (Directory newNamed: 'docs') renameTo: 'mydocs'. (Directory newNamed: '/docs') renameTo: '/mydocs'.</lang>
Smalltalk
<lang smalltalk>File rename: 'input.txt' to: 'output.txt'. File rename: 'docs' to: 'mydocs'. "as for other example, this works on systems
where the root is / ..."
File rename: '/input.txt' to: '/output.txt'. File rename: '/docs' to: '/mydocs'</lang>
Standard ML
<lang sml>OS.FileSys.rename {old = "input.txt", new = "output.txt"}; OS.FileSys.rename {old = "docs", new = "mydocs"}; OS.FileSys.rename {old = "/input.txt", new = "/output.txt"}; OS.FileSys.rename {old = "/docs", new = "/mydocs"};</lang>
Tcl
Assuming that the Bash example shows what is actually meant with this task (one file and one directory here, one file and one directory in the root) and further assuming that this is supposed to be generic (i.e. OS agnostic): <lang tcl>file rename inputs.txt output.txt file rename docs mydocs
file rename [file nativename /inputs.txt] [file nativename /output.txt] file rename [file nativename /docs] [file nativename /mydocs]</lang> Without the need to work on unusual platforms like Mac OS 9, the code could be just: <lang tcl>file rename inputs.txt output.txt file rename docs mydocs
file rename /inputs.txt /output.txt file rename /docs /mydocs</lang>
Toka
<lang toka>needs shell " input.txt" " output.txt" rename " /input.txt" " /output.txt" rename
" docs" " mydocs" rename " /docs" " /mydocs" rename</lang>
TUSCRIPT
<lang tuscript> $$ MODE TUSCRIPT - rename file ERROR/STOP RENAME ("input.txt","output.txt") - rename directory ERROR/STOP RENAME ("docs","mydocs",-std-) </lang>
UNIX Shell
<lang bash>mv input.txt output.txt mv /input.txt /output.txt mv docs mydocs mv /docs /mydocs</lang>
Vedit macro language
Vedit allows using either '\' or '/' as directory separator character, it is automatically converted to the one used by the operating system. <lang vedit>// In current directory File_Rename("input.txt", "output.txt") File_Rename("docs", "mydocs")
// In the root directory File_Rename("/input.txt", "/output.txt") File_Rename("/docs", "/mydocs")</lang>
Visual Basic .NET
Platform: .NET
<lang vbnet>'Current Directory IO.Directory.Move("docs", "mydocs") IO.File.Move("input.txt", "output.txt")
'Root IO.Directory.Move("\docs", "\mydocs") IO.File.Move("\input.txt", "\output.txt")
'Root, platform independent IO.Directory.Move(IO.Path.DirectorySeparatorChar & "docs", _
IO.Path.DirectorySeparatorChar & "mydocs")
IO.File.Move(IO.Path.DirectorySeparatorChar & "input.txt", _
IO.Path.DirectorySeparatorChar & "output.txt")</lang>
Yorick
<lang yorick>rename, "input.txt", "output.txt"; rename, "/input.txt", "/output.txt"; rename, "docs", "mydocs"; rename, "/docs", "/mydocs";</lang>
- Programming Tasks
- File System Operations
- Ada
- ALGOL 68
- AWK
- AutoHotkey
- BASIC
- Applesoft BASIC
- ZX Spectrum Basic
- Batch File
- BBC BASIC
- C
- C++
- Boost
- C sharp
- Clojure
- Common Lisp
- D
- DCL
- Delphi
- E
- Factor
- Fantom
- Forth
- Fortran
- Go
- Groovy
- Haskell
- HicEst
- Icon
- Unicon
- J
- Java
- JavaScript
- Liberty BASIC
- Lua
- Mathematica
- MAXScript
- MUMPS
- Objective-C
- Objeck
- OCaml
- Octave
- Openedge/Progress
- PARI/GP
- Pascal
- Perl
- PHP
- PicoLisp
- Pike
- Pop11
- PowerShell
- PureBasic
- Python
- R
- REALbasic
- REBOL
- REXX
- Ruby
- Fileutils.rb
- Scheme
- Seed7
- Slate
- Smalltalk
- Standard ML
- Tcl
- Toka
- TUSCRIPT
- UNIX Shell
- Vedit macro language
- Visual Basic .NET
- Yorick
- TI-83 BASIC/Omit
- TI-89 BASIC/Omit
- Befunge/Omit
- Unlambda/Omit
- Retro/Omit