File size
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 verify the size of a file called "input.txt" for a file in the current working directory and another one in the file system root.
Ada
<ada>
with Ada.Text_Io; with Ada.Direct_Io; procedure Size is function File_Size (Name : String) return Natural is package Char_Io is new Ada.Direct_Io(Character); use Char_Io; The_File : Char_Io.File_Type; The_Size : Natural; begin Char_Io.Open(File => The_File, Name => Name, Mode => In_File); The_Size := Natural(Size(The_File)); Close(The_File); return The_Size; end File_Size; Name_1 : String := "input.txt"; Name_2 : String := "/input.txt"; begin Ada.Text_Io.Put_Line(Name_1 & " contains" & Integer'Image(File_Size(Name_1)) & " characters"); Ada.Text_Io.Put_Line(Name_2 & " contains" & Integer'Image(File_Size(Name_2)) & " characters"); end Size;
</ada>
ALGOL 68
There is no build in way to find the size of an arbitrary file, especially of the file is a special channel, e.g. a tape device.
Conceptually the PROC set = (REF FILE file, INT page, line, character)VOID: ~
could be used to do a binary search find the last pages page number. And if it is known
that every page has the same number of lines, and every line has the same number of
CHARS
,
and the character set is not compressible
, then the size could be calculated.
It is probably much easier to use some an operating system library. This library is not part of
the standard ALGOL 68 language definition.
C
POSIX:
#include <stdio.h>
#include <sys/stat.h>
int main() {
struct stat foo;
stat("input.txt", &foo);
printf("%ld\n", foo.st_size);
stat("/input.txt", &foo);
printf("%ld\n", foo.st_size);
return 0;
}
Clean
There is not function to get the file size, therefore we seek to the end and query the file pointer position.
import StdEnv
fileSize fileName world
# (ok, file, world) = fopen fileName FReadData world
| not ok = abort "Cannot open file"
# (ok, file) = fseek file 0 FSeekEnd
| not ok = abort "Cannot seek file"
# (size, file) = fposition file
(_, world) = fclose file world
= (size, world)
Start world = fileSize "input.txt" world
D
Alternative ways to get file size in D.
module fileio ;
import std.stdio ;
import std.path ;
import std.file ;
import std.mmfile ; // NB: mmfile can treat the file as an array in memory
import std.stream ;
string[] genName(string name){
string cwd = curdir ~ sep ; // on current directory
string root = sep ; // on root
// remove path, left only basename
name = std.path.getBaseName(name) ;
// NB:in D ver.2, getBaseName is alias of basename
return [cwd ~ name, root ~ name] ;
}
void testsize(string fname) {
foreach(fn ; genName(fname)){
try {
writefln("file %s has size:", fn) ;
writefln("%10d bytes by std.file.getSize (function),", std.file.getSize(fn)) ;
writefln("%10d bytes by std.stream (class),", (new std.stream.File(fn)).size) ;
writefln("%10d bytes by std.mmfile (class).", (new std.mmfile.MmFile(fn)).length) ;
} catch (Exception e) {
writefln(e.msg) ;
}
}
}
void main(){
writefln("== test : File Size ==") ;
testsize(r".\input.txt") ;
}
Factor
"input.txt" file-length .
1321
"file-does-not-exist.txt" file-length .
f
Forth
: .filesize ( addr len -- ) 2dup type ." is "
r/o open-file throw
dup file-size throw <# #s #> type ." bytes long." cr
close-file throw ;
s" input.txt" .filesize
s" /input.txt" .filesize
Groovy
println new File('index.txt').length();
println new File('/index.txt').length();
Java
import java.util.File;
public class FileSizeTest {
public static long getFileSize(String filename) {
return new File(filename).length();
}
public static void test(String type, String filename) {
System.out.println("The following " + type + " called " + filename +
" has a file size of " + getFileSize(filename) + " bytes."
);
}
public static void main(String args[]) {
test("file", "input.txt");
test("file", File.seperator + "input.txt");
}
}
MAXScript
-- Returns filesize in bytes or 0 if the file is missing
getFileSize "index.txt"
getFileSize "\index.txt"
OCaml
<ocaml>#load "unix.cma" ;;
open Unix ;;
Printf.printf "%d\n" (stat "input.txt").st_size ;;
Printf.printf "%d\n" (stat "/input.txt").st_size ;;</ocaml>
For files greater than Pervasives.max_int, one can use the module Unix.LargeFile.
Perl
use File::Spec::Functions qw(catfile rootdir);
print -s 'input.txt';
print -s catfile rootdir, 'input.txt';
Pop11
;;; prints file size in bytes
sysfilesize('input.txt') =>
sysfilesize('/input.txt') =>
Python
import os
size = os.path.getsize('input.txt')
size = os.path.getsize('/input.txt')
RapidQ
File I/O is one of the things where RapidQ differs from standard Basic. RapidQ uses file streams.
Method 1: display file size using file streams
$INCLUDE "rapidq.inc"
DIM file AS QFileStream
FUNCTION fileSize(name$) AS Integer
file.Open(name$, fmOpenRead)
Result = file.Size
file.Close
END FUNCTION
PRINT "Size of input.txt is "; fileSize("input.txt")
PRINT "Size of \input.txt is "; fileSize("\input.txt")
Method 2: using DIR$
FileName$ = DIR$("input.txt", 0)
PRINT "Size of input.txt is "; FileRec.Size
FileName$ = DIR$("\input.txt", 0)
PRINT "Size of \input.txt is "; FileRec.Size
Raven
'input.txt' status.size
'/input.txt' status.size
Toka
A trivial method follows:
" input.txt" "R" file.open dup file.size . file.close
" /input.txt" "R" file.open dup file.size . file.close
A better method would be to define a new function that actually
checks whether the file exists:
[ "R" file.open
dup 0 <> [ dup file.size . file.close ] ifTrue
drop
] is display-size
" input.txt" display-size
" /input.txt" display-size
UNIX Shell
du input.txt
du /input.txt
Visual Basic .NET
Platform: .NET
Dim local As New IO.FileInfo("input.txt")
Console.WriteLine(local.Length)
Dim root As New IO.FileInfo("\input.txt")
Console.WriteLine(root.Length)