File size

From Rosetta Code
Task
File size
You are encouraged to solve this task according to the task description, using any language you may know.

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[edit]

with Ada.Directories;  use Ada.Directories;
with Ada.Text_IO; use Ada.Text_IO;
 
procedure Test_File_Size is
begin
Put_Line (File_Size'Image (Size ("input.txt")) & " bytes");
Put_Line (File_Size'Image (Size ("/input.txt")) & " bytes");
end Test_File_Size;

Note that reference to the root directory, if there is any, is OS specific.

ALGOL 68[edit]

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 procedure
PROC set = (REF FILE file,  INT page, line, character)VOID: ~ 

could be used to do a binary search find the last page's page number. And if it is known that every page has the same number of lines, and every line has the same number of char[s], and the character set is not compressible, then the size could be quickly calculated. Otherwise every page, and every line would have to be tallied.

It is probably much easier to use some an operating system library. This library is not part of the standard ALGOL 68 language definition.

AutoHotkey[edit]

FileGetSize, FileSize, input.txt  ; Retrieve the size in bytes.
MsgBox, Size of input.txt is %FileSize% bytes
FileGetSize, FileSize, \input.txt, K ; Retrieve the size in Kbytes.
MsgBox, Size of \input.txt is %FileSize% Kbytes

AWK[edit]

Works with: gawk
@load "filefuncs"
function filesize(name ,fd) {
if ( stat(name, fd) == -1)
return -1 # doesn't exist
else
return fd["size"]
}
BEGIN {
print filesize("input.txt")
print filesize("/input.txt")
}

Some awk's don't have direct access to the filesystem, but can execute system-commands like dir (DOS/Windows) and ls

BEGIN {
 
# Windows
out = system2var("for %I in (input.txt) do @echo %~zI")
printf("input.txt\t%s\n", out)
out = system2var("for %I in (\input.txt) do @echo %~zI")
printf("\input.txt\t%s\n", out)
 
# Non-Windows
out = getline2var("ls -l input.txt")
split(out, size, " ")
printf("input.txt\t%s\n", size[5])
out = getline2var("ls -l /input.txt")
split(out, size, " ")
printf("/input.txt\t%s\n", size[5])
}
 
# Windows system() method
function system2var(command ,tempfile, cmd, out, rec, data, i) {
tempfile = "C:\\TEMP\\TMP.TMP"
cmd = command " > " tempfile
system(cmd)
close(cmd)
while (getline rec < tempfile > 0) {
if ( ++i == 1 )
data = rec
else
data = data "\n" rec
}
return(data)
}
 
# Non-windows getline method
function getline2var(command ,fish, scale, ship) {
command = command " 2>/dev/null"
while ( (command | getline fish) > 0 ) {
if ( ++scale == 1 )
ship = fish
else
ship = ship "\n" fish
}
close(command)
return ship
}


See also UNIX_Shell]

Axe[edit]

If GetCalc("appvINPUT")→I
Disp {I-2}ʳ▶Dec,i
Else
Disp "NOT FOUND",i
End

Batch File[edit]

Outputs file size of the first parameter (you can drag and drop a file in aswell).

 
@echo off
if not exist "%~1" exit /b 1 & rem If file doesn't exist exit with error code of 1.
for /f %%i in (%~1) do echo %~zi
pause>nul
 

BBC BASIC[edit]

      file% = OPENIN(@dir$+"input.txt")
IF file% THEN
PRINT "File size = " ; EXT#file%
CLOSE #file%
ENDIF
 
file% = OPENIN("\input.txt")
IF file% THEN
PRINT "File size = " ; EXT#file%
CLOSE #file%
ENDIF

Bracmat[edit]

This solution assumes that the file can be opened for reading. The fil function is the Bracmat interface to the underlying C functions fopen, fclose, fseek, ftell, fread, fgetc, fwrite, fputc and feof. More than one file can be opened at the same time. Focus is shifted from one open file to another by mentioning the file name as the first argument.

(getFileSize=
size
. fil$(!arg,rb) {read in binary mode}
& fil$(,END) {seek to end of file}
& fil$(,TEL):?size {tell where we are}
& fil$(,SET,-1) {seeking to an impossible position closes the file, and fails}
| !size {return the size}
);
 
getFileSize$"valid.bra"
113622
 
getFileSize$"c:\\boot.ini"
211
 

C[edit]

#include <stdlib.h>
#include <stdio.h>
 
long getFileSize(const char *filename)
{
long result;
FILE *fh = fopen(filename, "rb");
fseek(fh, 0, SEEK_END);
result = ftell(fh);
fclose(fh);
return result;
}
 
int main(void)
{
printf("%ld\n", getFileSize("input.txt"));
printf("%ld\n", getFileSize("/input.txt"));
return 0;
}
Works with: POSIX
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
 
int main(void)
{
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;
}

C++[edit]

#include <iostream>
#include <fstream>
 
std::ios::off_type getFileSize(const char *filename) {
std::ifstream f(filename);
std::ios::pos_type begin = f.tellg();
f.seekg(0, std::ios::end);
std::ios::pos_type end = f.tellg();
return end - begin;
}
 
int main() {
std::cout << getFileSize("input.txt") << std::endl;
std::cout << getFileSize("/input.txt") << std::endl;
return 0;
}

optimized

#include <iostream>
#include <fstream>
 
int main()
{
std::cout << std::ifstream("input.txt", std::ios::binary | std::ios::ate).tellg() << "\n"
<< std::ifstream("/input.txt", std::ios::binary | std::ios::ate).tellg() << "\n";
}

C#[edit]

using System;
using System.IO;
 
class Program
{
static void Main(string[] args)
{
Console.WriteLine(new FileInfo("/input.txt").Length);
Console.WriteLine(new FileInfo("input.txt").Length);
}
}
 

Clean[edit]

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

Clojure[edit]

(require '[clojure.java.io :as io])
(defn show-size [filename]
(println filename "size:" (.length (io/file filename))))
 
(show-size "input.txt")
(show-size "/input.txt")

ColdFusion[edit]

<cfscript>
localFile = getFileInfo(expandpath("input.txt"));
rootFile = getFileInfo("/input.txt");
</cfscript>
 
<cfoutput>
Size of input.txt is #localFile.size# bytes.
Size of /input.txt is #rootFile.size# bytes.
</cfoutput>

Common Lisp[edit]

(with-open-file (stream (make-pathname :name "input.txt")
:direction :input
:if-does-not-exist nil)
(print (if stream (file-length stream) 0)))
 
(with-open-file (stream (make-pathname :directory '(:absolute "") :name "input.txt")
:direction :input
:if-does-not-exist nil)
(print (if stream (file-length stream) 0)))

D[edit]

import std.file, std.stdio, std.path, std.file, std.stream,
std.mmfile;
 
void main() {
immutable fileName = "file_size.exe";
 
try {
writefln("File '%s' has size:", fileName);
 
writefln("%10d bytes by std.file.getSize (function)",
std.file.getSize(fileName));
 
writefln("%10d bytes by std.stream (class)",
new std.stream.File(fileName).size);
 
// mmfile can treat the file as an array in memory.
writefln("%10d bytes by std.mmfile (class)",
new std.mmfile.MmFile(fileName).length);
} catch (Exception e) {
e.msg.writefln;
}
}
Output:
File 'file_size.exe' has size:
   1066164 bytes by std.file.getSize (function)
   1066164 bytes by std.stream (class)
   1066164 bytes by std.mmfile (class)

Delphi[edit]

program SizeOfFile;
 
{$APPTYPE CONSOLE}
 
uses SysUtils;
 
function CheckFileSize(const aFilename: string): Integer;
var
lFile: file of Byte;
begin
AssignFile(lFile, aFilename);
FileMode := 0; {Access file in read only mode}
Reset(lFile);
Result := FileSize(lFile);
CloseFile(lFile);
end;
 
begin
Writeln('input.txt ', CheckFileSize('input.txt'));
Writeln('\input.txt ', CheckFileSize('\input.txt'));
end.

E[edit]

for file in [<file:input.txt>, <file:///input.txt>] {
println(`The size of $file is ${file.length()} bytes.`)
}

Eiffel[edit]

 
class
APPLICATION
create
make
feature {NONE} -- Initialization
make
-- Run application.
do
create input_file.make_open_read ("input.txt")
print(input_file.count)
print("%N")
input_file.close
create environment
input_file.make_open_read(environment.root_directory_name + "input.txt")
print(input_file.count)
input_file.close
end
feature -- Access
input_file: PLAIN_TEXT_FILE
environment:EXECUTION_ENVIRONMENT
end
 

Elena[edit]

#import system.
#import system'io.
 
#symbol program =
[
console writeLine:("input.txt" file_path length).
 
console writeLine:("\input.txt" file_path length).
].

Elixir[edit]

IO.puts File.stat!("input.txt").size
IO.puts File.stat!("/input.txt").size

Emacs Lisp[edit]

This shows nil if no such file since file-attributes returns nil in that case.

(message "sizes are %s and %s"
(nth 7 (file-attributes "input.txt"))
(nth 7 (file-attributes "/input.txt")))

Erlang[edit]

-module(file_size).
-export([file_size/0]).
 
-include_lib("kernel/include/file.hrl").
 
file_size() ->
print_file_size("input.txt"),
print_file_size("/input.txt").
 
print_file_size(Filename) ->
case file:read_file_info(Filename) of
{ok, FileInfo} ->
io:format("~s ~p~n", [Filename, FileInfo#file_info.size]);
{error, _} ->
io:format("~s could not be opened~n",[Filename])
end.
 

Euphoria[edit]

include file.e
 
function file_size(sequence file_name)
object x
x = dir(file_name)
if sequence(x) and length(x) = 1 then
return x[1][D_SIZE]
else
return -1 -- the file does not exist
end if
end function
 
procedure test(sequence file_name)
integer size
size = file_size(file_name)
if size < 0 then
printf(1,"%s file does not exist.\n",{file_name})
else
printf(1,"%s size is %d.\n",{file_name,size})
end if
end procedure
 
test("input.txt") -- in the current working directory
test("/input.txt") -- in the file system root

Factor[edit]

"input.txt" file-info size>> .
1321
"file-does-not-exist.txt" file-info size>>
"Unix system call ``stat'' failed:"...

FBSL[edit]

FileLen returns -1 if the file is not found. FileLen will also accept a file handle and give the file length of the open file.

#APPTYPE CONSOLE
 
PRINT FileLen("sync.log")
PRINT FileLen("\sync.log")
PAUSE
 

Forth[edit]

: .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

Fortran[edit]

Alas, although there is a statement INQUIRE(FILE="Input.txt",EXIST = ISTHERE, RECL = RL, etc.) whereby a logical variable ISTHERE has a value (output: assigned left-to-right) according to whether a named file (input: assignment right-to-left) exists or not, and the parameter RECL returns the maximum allowed record length for the file, there is no parameter that reports how many records there are in the file so that the file size remains unknowable. Further, the value returned by RECL is not necessarily related to the file itself, but is likely to be a standard value such as 132, a default used when deciding on the line wrap length with free-format output as in WRITE (6,*) stuff but not necessarily being a limit on the length of a line written or read.

Further, in the ASCII world, text files are often implemented as variable-length records with special characters inline as record boundaries, usually one of CR, CRLF, LFCR, or LF. Without knowing which is in use, the storage taken up by them would be unknown. Other file systems may offer different types of disc files with fixed-size records or variable length records with a record length counter, but this is not standard across all computers.

In other words, Fortran does not specify a linkage to the filesystem whereby these details could be revealed, and not all filesystems maintain them anyway.

But if one wrote Fortran on a B6700 system, its F77 compiler offered additional attributes that could be returned via an INQUIRE statement: MAXRECSIZE really was the length of the longest record in the disc file (whether fixed record lengths or variable record lengths), BLOCKSIZE reported the number of records per block of disc space, AREASIZE the size of a disc space allocation area, and AREAS their number, while KIND reveals the code number of the type of file (not via a .txt suffix or whatever). Armed with these values, the file size could be determined in bits, bytes, words (six characters/word), records, blocks and areas.

These facilities were not carried forward into standardised Fortran 90, etc. So, one is stuck with devising a routine that reads all the records of a disc file, counting their length. This is straightforward, but tedious, as in the following fragment:
   20     READ (INF,21, END = 30) L	!R E A D  A  R E C O R D - but only its length.
21 FORMAT(Q) !This obviously indicates the record's length.
NRECS = NRECS + 1 !CALL LONGCOUNT(NRECS,1) !C O U N T A R E C O R D.
NNBYTES = NNBYTES + L !CALL LONGCOUNT(NNBYTES,L) !Not counting any CRLF (or whatever) gibberish.
IF (L.LT.RMIN) THEN !Righto, now for the record lengths.
RMIN = L !This one is shorter.
RMINR = NRECS !Where it's at.
ELSE IF (L.GT.RMAX) THEN !Perhaps instead it is longer?
RMAX = L !Longer.
RMAXR = NRECS !Where it's at.
END IF !So much for the lengths.
GO TO 20 !All I wanted to know...

The LONGCOUNT routine uses two 32-bit integers (the first parameter being a two-element array) to deliver a much larger capacity, given modern file size opportunities, but this is unnecessary if INTEGER*8 variables are available. The count will not include any contribution from record splitters such as CR, etc. A file more properly thought of as containing binary data (say, integer or floating-point values) will by chance have a CR or LF bit pattern here and there, and they will be taken as marking record splits when reading a file as being FORMATTED, which is the default setting.

F#[edit]

open NUnit.Framework
open FsUnit
 
[<Test>]
let ``Validate that the size of the two files is the same`` () =
let local = System.IO.FileInfo(__SOURCE_DIRECTORY__ + "\input.txt")
let root = System.IO.FileInfo(System.IO.Directory.GetDirectoryRoot(__SOURCE_DIRECTORY__) + "input.txt")
local.Length = root.Length |> should be True

Go[edit]

package main
 
import "fmt"
import "os"
 
func printFileSize(f string) {
if stat, err := os.Stat(f); err != nil {
fmt.Println(err)
} else {
fmt.Println(stat.Size())
}
}
 
func main() {
printFileSize("input.txt")
printFileSize("/input.txt")
}

Groovy[edit]

println new File('index.txt').length();
println new File('/index.txt').length();

Haskell[edit]

import System.IO
 
printFileSize filename = withFile filename ReadMode hFileSize >>= print
 
main = mapM_ printFileSize ["input.txt", "/input.txt"]

or

import System.Posix.File
 
printFileSize filename = do stat <- getFileStatus filename
print (fileSize stat)
 
main = mapM_ printFileSize ["input.txt", "/input.txt"]

HicEst[edit]

READ(FILE="input.txt", LENgth=bytes) ! bytes = -1 if not existent
READ(FILE="C:\input.txt", LENgth=bytes) ! bytes = -1 if not existent

Icon and Unicon[edit]

Icon doesn't support 'stat'; however, information can be obtained by use of the system function to access command line.

every dir := !["./","/"] do {
write("Size of ",f := dir || "input.txt"," = ",stat(f).size) |stop("failure for to stat ",f)
}

Note: Icon and Unicon accept both / and \ for directory separators.

J[edit]

require 'files'
fsize 'input.txt';'/input.txt'

Java[edit]

import java.io.File;
 
public class FileSize
{
public static void main ( String[] args )
{
System.out.println("input.txt  : " + new File("input.txt").length() + " bytes");
System.out.println("/input.txt : " + new File("/input.txt").length() + " bytes");
}
}
 

JavaScript[edit]

Works with: JScript
var fso = new ActiveXObject("Scripting.FileSystemObject");
fso.GetFile('input.txt').Size;
fso.GetFile('c:/input.txt').Size;

The following works in all browsers, including IE10.

var file = document.getElementById("fileInput").files.item(0); //a file input element
if (file) {
var reader = new FileReader();
reader.readAsText(file, "UTF-8");
reader.onload = loadedFile;
reader.onerror = errorHandler;
}
function loadedFile(event) {
var fileString = event.target.result;
alert(fileString.length);
}
function errorHandler(event) {
alert(event);
}

jq[edit]

jq -Rs length input.txt
 
jq -Rs length /input.txt

The -R option causes the file to be read as text, and the -s option causes it to be read as a single string.

Julia[edit]

println(filesize("input.txt"))
println(filesize("/input.txt"))

K[edit]

_size "input.txt"
_size "/input.txt"


Lasso[edit]

// local to current directory
local(f = file('input.txt'))
handle => { #f->close }
#f->size
 
// file at file system root
local(f = file('//input.txt'))
handle => { #f->close }
#f->size
 

Liberty BASIC[edit]

'input.txt in current directory
OPEN DefaultDir$ + "/input.txt" FOR input AS #m
PRINT "File size: "; lof(#m)
CLOSE #m
 
'input.txt in root
OPEN "c:/input.txt" FOR input AS #m
PRINT "File size: "; lof(#m)
CLOSE #m

LiveCode[edit]

// root folder
set the defaultfolder to "/"
repeat for each line fline in (the detailed files)
if item 1 of fline is "input.txt" then
put item 2 of fline --bytes
exit repeat
end if
end repeat
 
// current working dir of stack
put the effective filename of this stack into tPath
set the itemDelimiter to slash
delete last item of tPath
set the defaultfolder to tPath
repeat for each line fline in (the detailed files)
if item 1 of fline is "input.txt" then
put item 2 of fline
exit repeat
end if
end repeat

Lua[edit]

function GetFileSize( filename )
local fp = io.open( filename )
if fp == nil then
return nil
end
local filesize = fp:seek( "end" )
fp:close()
return filesize
end

Maple[edit]

FileTools:-Size( "input.txt" )
FileTools:-Size( "/input.txt" )

Mathematica / Wolfram Language[edit]

 
FileByteCount["input.txt"]
FileByteCount[FileNameJoin[{$RootDirectory, "input.txt"}]]

MATLAB / Octave[edit]

d1 = dir('input.txt');
d2 = dir('/input.txt');
fprintf('Size of input.txt is %d bytes\n', d1.bytes)
fprintf('Size of /input.txt is %d bytes\n', d2.bytes)

MAXScript[edit]

-- Returns filesize in bytes or 0 if the file is missing
getFileSize "index.txt"
getFileSize "\index.txt"

Mirah[edit]

import java.io.File
 
puts File.new('file-size.mirah').length()
puts File.new("./#{File.separator}file-size.mirah").length()

mIRC Scripting Language[edit]

echo -ag $file(input.txt).size bytes
echo -ag $file(C:\input.txt).size bytes

Modula-3[edit]

MODULE FSize EXPORTS Main;
 
IMPORT IO, Fmt, FS, File, OSError;
 
VAR fstat: File.Status;
 
BEGIN
TRY
fstat := FS.Status("input.txt");
IO.Put("Size of input.txt: " & Fmt.LongInt(fstat.size) & "\n");
fstat := FS.Status("/input.txt");
IO.Put("Size of /input.txt: " & Fmt.LongInt(fstat.size) & "\n");
EXCEPT
| OSError.E => IO.Put("ERROR: Could not get file status.\n");
END;
END FSize.

NetRexx[edit]

/* NetRexx */
options replace format comments java symbols binary
 
runSample(arg)
return
 
-- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
method fileSize(fn) public static returns double
ff = File(fn)
fSize = ff.length()
return fSize
 
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
method runSample(arg) private static
parse arg files
if files = '' then files = 'input.txt F docs D /input.txt F /docs D'
loop while files.length > 0
parse files fn ft files
select case(ft.upper())
when 'F' then do
ft = 'File'
end
when 'D' then do
ft = 'Directory'
end
otherwise do
ft = 'File'
end
end
sz = fileSize(fn)
say ft ''''fn'''' sz 'bytes.'
end
 
return
Output:
J:\>nrc fsz
java -cp "c:\netRexx\lib\NetRexxR.jar;c:\netRexx\lib\NetRexxC.jar;.;C:\Program Files\BSF4ooRexx\bsf4ooRexx-v452-20150825-bin.jar;;c:\netrexx\lib\NetRexxF.jar;." -Dnrx.compiler=ecj org.netrexx.process.NetRexxC  fsz
NetRexx portable processor 3.04 GA build 4-20150630-1657
Copyright (c) RexxLA, 2011,2015.   All rights reserved.
Parts Copyright (c) IBM Corporation, 1995,2008.
Program fsz.nrx
    function fileSize(Rexx)
    function runSample(Rexx)
Compilation of 'fsz.nrx' successful

J:\>java fsz test.txt
File 'test.txt' 8 bytes.

NewLISP[edit]

(println (first (file-info "input.txt")))
(println (first (file-info "/input.txt")))

Nim[edit]

import os
echo getFileSize "input.txt"
echo getFileSize "/input.txt"

Objective-C[edit]

NSFileManager *fm = [NSFileManager defaultManager];
 
// Pre-OS X 10.5
NSLog(@"%llu", [[fm fileAttributesAtPath:@"input.txt" traverseLink:YES] fileSize]);
 
// OS X 10.5+
NSLog(@"%llu", [[fm attributesOfItemAtPath:@"input.txt" error:NULL] fileSize]);

Objeck[edit]

 
use IO;
...
File("input.txt")->Size()->PrintLine();
File("c:\input.txt")->Size()->PrintLine();
 

OCaml[edit]

let printFileSize filename =
let ic = open_in filename in
Printf.printf "%d\n" (in_channel_length ic);
close_in ic ;;
 
printFileSize "input.txt" ;;
printFileSize "/input.txt" ;;

For files greater than Pervasives.max_int, one can use the module Unix.LargeFile:

let printLargeFileSize filename =
let ic = open_in filename in
Printf.printf "%Ld\n" (LargeFile.in_channel_length ic);
close_in ic ;;

Alternatively:

#load "unix.cma" ;;
open Unix ;;
Printf.printf "%d\n" (stat "input.txt").st_size ;;
Printf.printf "%d\n" (stat "/input.txt").st_size ;;

Oforth[edit]

File new("input.txt") size println
File new("/input.txt") size println

ooRexx[edit]

Parse Version v
Say v
fid='test.txt'
x=sysfiletree(fid,a.)
Say a.0
Say a.1
Say left(copies('123456789.',10),length(a.1))
Parse Var a.1 20 size .
Say 'file size:' size
s=charin(fid,,1000)
Say length(s)
Say 'file' fid
'type' fid
Output:
J:\>rexx sft
REXX-ooRexx_4.2.0(MT)_64-bit 6.04 22 Feb 2014
1
 7/26/16   3:28p           8  A----  J:\test.txt
123456789.123456789.123456789.123456789.12345678
file size: 8
8
file test.txt
12
34

Oz[edit]

declare
[Path] = {Module.link ['x-oz://system/os/Path.ozf']}
in
{Show {Path.size "input.txt"}}
{Show {Path.size "/input.txt"}}

Pascal[edit]

See Delphi

Perl[edit]

my $size1 = -s 'input.txt';
my $size2 = -s '/input.txt';

Or, to be 100% cross-platform:

use File::Spec::Functions qw(catfile rootdir);
my $size1 = -s 'input.txt';
my $size2 = -s catfile rootdir, 'input.txt';

Alternative way to get the size:

my $size1 = (stat 'input.txt')[7];  # builtin stat() returns an array with file size at index 7
my $size2 = (stat '/input.txt')[7];

Perl 6[edit]

Works with: Rakudo version 2015.12
say 'input.txt'.IO.s;
say '/input.txt'.IO.s;

Cross-platform version of the second one:

say $*SPEC.rootdir.IO.child("input.txt").s;

Phix[edit]

function file_size(sequence file_name)
object d = dir(file_name)
if atom(d) or length(d)!=1 then return -1 end if
return d[1][D_SIZE]
end function
 
procedure test(sequence file_name)
integer size = file_size(file_name)
if size<0 then
printf(1,"%s file does not exist.\n",{file_name})
else
printf(1,"%s size is %d.\n",{file_name,size})
end if
end procedure
 
test("input.txt") -- in the current working directory
test("/input.txt") -- in the file system root

PHP[edit]

<?php
echo filesize('input.txt'), "\n";
echo filesize('/input.txt'), "\n";
?>

PicoLisp[edit]

(println (car (info "input.txt")))
(println (car (info "/input.txt")))

Pike[edit]

import Stdio;
 
int main(){
write(file_size("input.txt") + "\n");
write(file_size("/input.txt") + "\n");
}

PL/I[edit]

 
/* To obtain file size of files in root as well as from current directory. */
 
test: proc options (main);
declare ch character (1);
declare i fixed binary (31);
declare in1 file record;
 
/* Open a file in the root directory. */
open file (in1) title ('//asd.log,type(fixed),recsize(1)');
on endfile (in1) go to next1;
do i = 0 by 1;
read file (in1) into (ch);
end;
next1:
put skip list ('file size in root directory =' || trim(i));
close file (in1);
 
/* Open a file in the current dorectory. */
open file (in1) title ('/asd.txt,type(fixed),recsize(1)');
on endfile (in1) go to next2;
do i = 0 by 1;
read file (in1) into (ch);
end;
next2:
put skip list ('local file size=' || trim(i));
end test;
 
I used differently-named files to prove that local and root directory
files were accessed.
This program ran with Windows PL/I.

Pop11[edit]

;;; prints file size in bytes
sysfilesize('input.txt') =>
sysfilesize('/input.txt') =>

PostScript[edit]

status returns status information about a file if given a file name. This includes the size in pages (implementation-dependent), the size in bytes, creation and modification time and a final true. The values not needed here are simply poped off the stack.

(input.txt  ) print
(input.txt) status pop pop pop = pop
(/input.txt ) print
(/input.txt) status pop pop pop = pop

PowerShell[edit]

Get-ChildItem input.txt | Select-Object Name,Length
Get-ChildItem \input.txt | Select-Object Name,Length

PureBasic[edit]

Debug FileSize("input.txt")
Debug FileSize("/input.txt")

Python[edit]

import os
 
size = os.path.getsize('input.txt')
size = os.path.getsize('/input.txt')

R[edit]

Works with: R version 2.8.1

R has a function file.info() in the base package that performs this function. Note that regardless of the OS, R uses forward slashes for the directories.

sizeinwd <- file.info('input.txt')[["size"]]
sizeinroot <- file.info('/input.txt')[["size"]]

Racket[edit]

#lang racket
(file-size "input.txt")
(file-size "/input.txt")

RapidQ[edit]

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[edit]

'input.txt'  status.size
'/input.txt' status.size

REBOL[edit]

size? %info.txt
size? %/info.txt
size? ftp://username:password@ftp.site.com/info.txt
size? http://rosettacode.org

Retro[edit]

The simple way is to open and read the size. This may crash if the file does not exist.

with files'
"input.txt" :R open &size sip close drop putn
"/input.txt" :R open &size sip close drop putn

For added stability, check that the returned file handle is not zero:

with files'
"input.txt" :R open over 0 <> [ &size sip close drop ] ifTrue

Or, if you need to do this more often, setup a function that'll also display an error message if the file does not exist:

with files'
: getFileSize ( $-n )
 :R open 0 over =
[ "File does Not Exist\n" puts ]
[ &size sip close drop ] if ;
 
"input.txt" getFileSize putn
"/input.txt" getFileSize putn

REXX[edit]

MS DOS version 1[edit]

This REXX example was executed on a Windows/XP system (in a DOS window).


Note that some operating systems don't have a concept of a current directory or a file system root.

/*REXX program verifies a file's size (by reading all the lines)  in current dir & root.*/
parse arg iFID . /*allow the user specify the file ID. */
if iFID=='' | iFID=="," then iFID='FILESIZ.DAT' /*Not specified? Then use the default.*/
say 'size of' iFID "=" fileSize(iFID) 'bytes' /*the current directory.*/
say 'size of \..\'iFID "=" fileSize('\..\'iFID) 'bytes' /* " root " */
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
fileSize: parse arg f; $=0; do while lines(f)\==0
$=$+length(charin(f,,1e6))
end /*while*/
return $

output   when using the default input:

size of FILESIZ.DAT = 2 bytes
size of \..\FILESIZ.DAT = 5 bytes

MS DOS version 2[edit]

/*REXX pgm to verify a file's size */
parse arg iFID . /*let user specify the file ID. */
if iFID=='' then iFID="FILESIZ.DAT" /*Not specified? Then use default*/
say 'size of' iFID':'
Say chars(ifid) '(CR LF included)'
Call lineout ifid /* close the file */
say filesize(ifid) '(net data)'
Call lineout ifid
exit
 
filesize: parse arg f;
sz=0;
Do while lines(f)\==0
sz=sz+length(linein(f))
End
return sz
Output:
size of FILESIZ.DAT:
4 (CR LF included)
2 (net data)

CMS version[edit]

Note that CMS hasn't a concept of a root.
Also note that the CMS system doesn't normally support the use of periods (.);   it uses blanks instead.

/*REXX program verifies a file's size  (by reading all the lines)  on the default mDisk.*/
parse arg iFID . /*allow the user specify the file ID. */
if iFID=='' | iFID=="," then iFID='FILESIZ DAT' /*Not specified? Then use the default.*/
say 'size of' iFID "=" filesize(iFID) 'bytes' /*on the default mDisk.*/
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
filesize: parse arg f; $=0; do while lines(f)\==0
$=$+length(linein(f))
end /*while*/
return $

Ring[edit]

See len(read('input.txt')) + nl
see len(read('/input.txt')) + nl

Ruby[edit]

size = File.size('input.txt')
size = File.size('/input.txt')

Run BASIC[edit]

print fileSize(DefaultDir$,"input.txt")  ' current default directory
print fileSize("","input.txt") ' root directory
 
function fileSize(dir$,file$)
open dir$;"\";file$ FOR input as #f
fileSize = lof(#f) ' Length Of File
close #f
end function

Rust[edit]

use std::{env, fs, process};
use std::io::{self, Write};
use std::fmt::Display;
 
fn main() {
let file_name = env::args().nth(1).unwrap_or_else(|| exit_err("No file name supplied", 1));
let metadata = fs::metadata(file_name).unwrap_or_else(|e| exit_err(e, 2));
 
println!("Size of file.txt is {} bytes", metadata.len());
}
 
#[inline]
fn exit_err<T: Display>(msg: T, code: i32) -> ! {
writeln!(&mut io::stderr(), "Error: {}", msg).expect("Could not write to stdout");
process::exit(code)
}
 
}

Scala[edit]

Library: Scala
import java.io.File
 
object FileSize extends App {
val name = "pg1661.txt"
 
println(s"$name  : ${new File(name).length()} bytes")
println(s"/$name : ${new File(s"${File.separator}$name").length()} bytes")
}

Scheme[edit]

 
(define (file-size filename)
(call-with-input-file filename (lambda (port)
(let loop ((c (read-char port))
(count 0))
(if (eof-object? c)
count
(loop (read-char port) (+ 1 count)))))))
 
(file-size "input.txt")
(file-size "/input.txt")
 

Seed7[edit]

$ include "seed7_05.s7i";
 
const proc: main is func
begin
writeln(fileSize("input.txt"));
writeln(fileSize("/input.txt"));
end func;

Sidef[edit]

say (Dir.cwd  + %f'input.txt' -> size);
say (Dir.root + %f'input.txt' -> size);

Slate[edit]

(File newNamed: 'input.txt') fileInfo fileSize.
(File newNamed: '/input.txt') fileInfo fileSize.

Smalltalk[edit]

Works with: GNU Smalltalk
(File name: 'input.txt') size printNl.
(File name: '/input.txt') size printNl.
Works with: Smalltalk/X
'input.txt' asFilename fileSize
'/input.txt' asFilename fileSize

Standard ML[edit]

val size = OS.FileSys.fileSize "input.txt" ;;
val size = OS.FileSys.fileSize "/input.txt" ;

Tcl[edit]

file size input.txt
file size /input.txt

Toka[edit]

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

TorqueScript[edit]

--Ipquarx June 19th, 10:00 AM

Since TorqueScript cannot set the current working directory, the second part of the task cannot be completed.

TGE Version (Works with all versions containing the basic file i/o):

Works with: TGE
%File = new FileObject();
%File.openForRead("input.txt");
 
while(!%File.isEOF())
{
%Length += strLen(%File.readLine());
}
 
%File.close();
%File.delete();


T3D Version (Only works with T3D):

Works with: T3D
fileSize("input.txt");

TUSCRIPT[edit]

 
$$ MODE TUSCRIPT
-- size of file input.txt
file="input.txt"
ERROR/STOP OPEN (file,READ,-std-)
file_size=BYTES ("input.txt")
ERROR/STOP CLOSE (file)
 
-- size of file x:/input.txt
ERROR/STOP OPEN (file,READ,x)
file_size=BYTES (file)
ERROR/STOP CLOSE (file)
 

UNIX Shell[edit]

An interactive user would run ls -l input.txt /input.txt to see the file sizes. This task is more difficult for a shell script, that must extract each size from command output.

Using ls[edit]

ls most likely gets the length from the file's inode.

size1=$(ls -l input.txt | tr -s ' ' | cut -d ' ' -f 5)
size2=$(ls -l /input.txt | tr -s ' ' | cut -d ' ' -f 5)

ls -l reports the size in 5th field, with spaces between fields. tr squeezes spaces (because cut needs one single space between fields), and cut extracts 5th field.

 
echo "# ls:"
ls -la input.txt
 
echo "# stat:"
stat input.txt
 
echo "# Size:"
size1=$(ls -l input.txt | tr -s ' ' | cut -d ' ' -f 5)
size2=$(wc -c < input.txt | tr -d ' ')
echo $size1, $size2
 
Output:
Test run at compileonline.com:
# ls:
-rw-r--r-- 1 apache apache 126 Nov  5 19:02 input.txt
# stat:
  File: `input.txt'
  Size: 126       	Blocks: 8          IO Block: 4096   regular file
Device: 700h/1792d	Inode: 2195776     Links: 1
Access: (0644/-rw-r--r--)  Uid: (   48/  apache)   Gid: (   48/  apache)
Access: 2014-11-05 19:02:25.000000000 -0600
Modify: 2014-11-05 19:02:25.000000000 -0600
Change: 2014-11-05 19:02:25.000000000 -0600
# Size:
126, 126

Using wc[edit]

wc may actually read the whole file and count the bytes. Some implementations, like wc.c from GNU coreutils, can optimize wc -c by getting the length from the file's inode.

size1=$(wc -c < input.txt | tr -d ' ')
size2=$(wc -c < /input.txt | tr -d ' ')

The peculiar use of wc -c < file, not wc -c file, is to prevent printing the file's name. Then wc only reports the size. Some versions of wc print spaces before the number; tr deletes all these spaces.

Using BSD stat[edit]

BSD has stat(1), a nonstandard command. With stat, a shell script can easily get the file size.

Works with: NetBSD version 1.6
Works with: FreeBSD version 4.10
Works with: OpenBSD version 3.8
size1=$(stat -f %z input.txt)
size2=$(stat -f %z /input.txt)

Z Shell[edit]

Works with: zsh
# from module 'zsh/stat', load builtin 'zstat'
zmodload -F zsh/stat b:zstat
 
size1=$(zstat +size input.txt)
size2=$(zstat +size /input.txt)

Ursa[edit]

decl file f
 
f.open "input.txt"
out (size f) endl console
f.close
 
f.open "/input.txt"
out (size f) endl console
f.close

VBScript[edit]

Works with: Windows Script Host version *
 
With CreateObject("Scripting.FileSystemObject")
WScript.Echo .GetFile("input.txt").Size
WScript.Echo .GetFile("\input.txt").Size
End With
 

Vedit macro language[edit]

Num_Type(File_Size("input.txt"))
Num_Type(File_Size("/input.txt"))

Visual Basic .NET[edit]

Platform: .NET

Works with: Visual Basic .NET version 9.0+
Dim local As New IO.FileInfo("input.txt")
Console.WriteLine(local.Length)
 
Dim root As New IO.FileInfo("\input.txt")
Console.WriteLine(root.Length)


zkl[edit]

File.info("input.txt").println();
File.info("/input.txt").println();

-->T(size,creation time,last mod time,isDir,mode), from stat(2)

Output:
L(391,1393658766,1393658766,False,33156)
Exception thrown: NameError(File.info(/input.txt): Could not open)