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.

Task
Rename a file
You are encouraged to solve this task according to the task description, using any language you may know.

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

Works with: ALGOL 68 version Standard - no extensions to language used

Note: reidf does not appear to be included in ALGOL 68G. Also note that file names would be Operating System dependent. <lang algol> 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:

$ 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")}'


AutoHotkey

<lang AutoHotkey> FileMove, oldname, newname </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++

Translation of: C

<lang cpp>

  1. include <cstdio>

int main() {

 std::rename("input.txt", "output.txt");
 std::rename("docs", "mydocs");
 std::rename("/input.txt", "/output.txt");
 std::rename("/docs", "/mydocs");

} </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>

DOS Batch File

 ren input.txt output.txt
 ren \input.txt output.txt
 ren docs mydocs
 ren \docs mydocs

E

<lang e>for where in [<file:.>, <file:///>] {

 where["input.txt"].renameTo(where["output.txt"], null)
 where["docs"].renameTo(where["mydocs"], null)

}</lang>

Forth

 s" input.txt"  s" output.txt" rename-file throw
s" /input.txt" s" /output.txt" rename-file throw

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>

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 sucess;
   }
   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.seperator + "input.txt", File.seperator + "output.txt");
        test("directory", "docs", "mydocs");
        test("directory", File.seperator + "docs" + File.seperator, File.seperator + "mydocs" + File.seperator);
   }
}</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

-- Here
renameFile "input.txt" "output.txt"
-- Root
renameFile "/input.txt" "/output.txt"

Objective-C

<lang objc>NSFileManager *fm = [NSFileManager defaultManager];

[fm movePath:@"input.txt" toPath:@"output.txt" handler:nil]; [fm movePath:@"docs" toPath:@"mydocs" handler:nil];</lang>

OCaml

Sys.rename "input.txt" "output.txt";;
Sys.rename "docs" "mydocs";;
Sys.rename "/input.txt" "/output.txt";;
Sys.rename "/docs" "/mydocs";;

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>

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');

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>

Python

<lang python>

import os

os.rename("input.txt", "output.txt")
os.rename("docs", "mydocs")

os.rename("/input.txt", "/output.txt")
os.rename("/docs", "/mydocs")

</lang>

Ruby

It uses a hash to store the source and destination, so it's easy to add more dirs/files to move and you can easily switch to using another method to move them.

<lang ruby> #!/usr/bin/env 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>

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

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"};

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

 needs shell
 " input.txt"  " output.txt"  rename
 " /input.txt"  " /output.txt"  rename
 
 " docs"  " mydocs"  rename
 " /docs"  " /mydocs"  rename

UNIX Shell

 mv input.txt output.txt
 mv /input.txt /output.txt
 mv docs mydocs
 mv /docs /mydocs

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

Works with: Visual Basic .NET version 9.0+
'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")