Truncate a file: Difference between revisions

 
(22 intermediate revisions by 17 users not shown)
Line 14:
This task permits the use of such facilities.   However, such behaviour should be noted, or optionally a warning message relating to an non change or increase in file size may be implemented.
<br><br>
 
=={{header|11l}}==
{{trans|Python}}
 
<syntaxhighlight lang="11l">F truncate_file(name, length)
I !fs:is_file(name)
R 0B
I length >= fs:file_size(name)
R 0B
fs:resize_file(name, length)
R 1B</syntaxhighlight>
 
=={{header|Action!}}==
The attached result has been obtained under DOS 2.5.
{{libheader|Action! Tool Kit}}
<syntaxhighlight lang="action!">INCLUDE "D2:IO.ACT" ;from the Action! Tool Kit
 
PROC Dir(CHAR ARRAY filter)
BYTE dev=[1]
CHAR ARRAY line(255)
 
Close(dev)
Open(dev,filter,6)
DO
InputSD(dev,line)
PrintE(line)
IF line(0)=0 THEN
EXIT
FI
OD
Close(dev)
RETURN
 
BYTE FUNC Find(CHAR ARRAY text CHAR c)
BYTE i
 
i=1
WHILE i<=text(0)
DO
IF text(i)=c THEN
RETURN (i)
FI
i==+1
OD
RETURN (0)
 
PROC MakeRenameCommand(CHAR ARRAY left,right,result)
BYTE i,len,pos
 
SCopy(result,left)
len=left(0)+1
result(len)=32
pos=Find(right,':)
FOR i=pos+1 TO right(0)
DO
len==+1
result(len)=right(i)
OD
result(0)=len
RETURN
 
PROC DeleteFile(CHAR ARRAY fname)
BYTE dev=[1]
Close(dev)
Xio(dev,0,33,0,0,fname)
RETURN
 
PROC TruncateFile(CHAR ARRAY fname CARD maxlen)
DEFINE BUF_LEN="100"
CHAR ARRAY tmp="D:TEMP.TMP",cmd(255)
BYTE in=[1], out=[2]
BYTE ARRAY buff(BUF_LEN)
CARD len,size
 
Close(in)
Close(out)
Open(in,fname,4)
Open(out,tmp,8)
 
DO
IF maxlen>BUF_LEN THEN
size=BUF_LEN
ELSE
size=maxlen
FI
len=Bget(in,buff,size)
maxlen==-len
IF len>0 THEN
Bput(out,buff,len)
FI
UNTIL len#BUF_LEN
OD
 
Close(in)
Close(out)
 
MakeRenameCommand(tmp,fname,cmd)
DeleteFile(fname)
Rename(cmd)
RETURN
 
PROC Main()
CHAR ARRAY filter="D:*.*", fname="D:INPUT.TXT"
CARD len=[400]
 
Put(125) PutE() ;clear screen
 
PrintF("Dir ""%S""%E",filter)
Dir(filter)
 
PrintF("Truncate ""%S"" to %U bytes.%E%E",fname,len)
TruncateFile(fname,len)
 
PrintF("Dir ""%S""%E",filter)
Dir(filter)
RETURN</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Truncate_a_file.png Screenshot from Atari 8-bit computer]
<pre>
Dir "D:*.*"
DOS SYS 037
DUP SYS 042
INPUT TXT 037
591 FREE SECTORS
 
Truncate "D:INPUT.TXT" to 400 bytes.
 
Dir "D:*.*"
DOS SYS 037
DUP SYS 042
INPUT TXT 004
624 FREE SECTORS
</pre>
 
=={{header|Ada}}==
Line 19 ⟶ 153:
The following program is an implementation in Ada using system-independent tools from the standard library to read and write files, remove and rename them. It should work for on any system with byte-oriented file storage and uses Ada 2012 conditional expressions.
 
<langsyntaxhighlight Adalang="ada">with Ada.Command_Line, Ada.Sequential_IO, Ada.Directories;
 
procedure Truncate_File is
Line 73 ⟶ 207:
end if;
end;
end Truncate_File;</langsyntaxhighlight>
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight lang="autohotkey">truncFile("S:\Portables\AutoHotkey\My Scripts\Other_Codes\motion2.ahk", 1200)
return
 
Line 88 ⟶ 222:
f.length := length_bytes
f.close()
}</langsyntaxhighlight>
 
=={{header|AWK}}==
<syntaxhighlight lang="awk">
<lang AWK>
# syntax: GAWK -f TRUNCATE_A_FILE.AWK
BEGIN {
Line 136 ⟶ 271:
return(msg)
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 150 ⟶ 285:
This is fairly generic MS BASIC. As such, it actually works in a wide variety of compilers and interpreters -- certainly too many to list here, but the list includes non-.Net [[Visual Basic]], [[FreeBASIC]], [[QB64]], etc. With a user-provided implementation of <code>DIR$</code>, it even works under [[QBasic]].
 
<langsyntaxhighlight lang="qbasic">SUB truncateFile (file AS STRING, length AS LONG)
IF LEN(DIR$(file)) THEN
DIM f AS LONG, c AS STRING
Line 169 ⟶ 304:
ERROR 53
END IF
END SUB</langsyntaxhighlight>
 
See also: [[#FreeBASIC|FreeBASIC]], [[#Liberty BASIC|Liberty BASIC]], [[#PowerBASIC|PowerBASIC]], [[#PureBasic|PureBasic]], [[#ZX Spectrum Basic|ZX Spectrum Basic]].
 
=={{header|BBC BASIC}}==
This will extend the file if the specified length is greater than the existing length. A test to prevent that could easily be added.
<langsyntaxhighlight lang="bbcbasic"> DEF PROCtruncate(file$, size%)
LOCAL file%
file% = OPENUP(file$)
Line 181 ⟶ 316:
EXT#file% = size%
CLOSE #file%
ENDPROC</langsyntaxhighlight>
 
=={{header|Bracmat}}==
Handling binary data is not easy in Bracmat. This solution reads all bytes as numbers. They are prepended to a list. After reversing the list, all numbers are written to the file. Notice that to close a file you should try to seek to a non-existing file position.<code>fil$(,SET,-1)</code> seeks to the position before the start of the file currently in focus.
<langsyntaxhighlight lang="bracmat">( ( trunc
= name length elif file c
. !arg:(?name,?length)
Line 207 ⟶ 342:
| out$"File too short"
)
);</langsyntaxhighlight>
Output:
<pre>I have a secret to t</pre>
Line 220 ⟶ 355:
 
{{works with|MinGW}}
<langsyntaxhighlight lang="c">#include <windows.h>
#include <stdio.h>
#include <wchar.h>
Line 300 ⟶ 435:
 
return dotruncate(fn, fp);
}</langsyntaxhighlight>
 
===POSIX===
<langsyntaxhighlight lang="c">#include <unistd.h>
#include <sys/types.h>
 
Line 310 ⟶ 445:
ftruncate(fd, length);
...
</syntaxhighlight>
</lang>
Both functions have <code>length</code> argument of <code>off_t</code> type. There are about a million possible errors, of interest to this task are <code>EFBIG</code>: size too large; <code>EINVAL</code>: size is negative or too large; <code>EIO</code>: IO error; <code>EACCESS</code> (for <code>truncate</code>): either can't see or can't write to the file; <code>EBADF</code> or <code>EINVAL</code> (for <code>ftruncate</code>): file descriptor is not a file descriptor, or not opened for writing.
 
When specifying a new file size larger than current value, the file will be extended and padded with null bytes.
 
=={{header|C++}}==
<lang C++>#include <string>
#include <fstream>
 
using namespace std;
 
void truncateFile(string filename, int max_size) {
std::ifstream input( filename, std::ios::binary );
char buffer;
string outfile = filename + ".trunc";
ofstream appendFile(outfile, ios_base::out);
for(int i=0; i<max_size; i++) {
input.read( &buffer, sizeof(buffer) );
appendFile.write(&buffer,1);
}
appendFile.close(); }
 
int main () {
truncateFile("test.txt", 5);
return 0;
}
</lang>
 
=={{header|C sharp}}==
 
<langsyntaxhighlight lang="c sharp">using System;
using System.IO;
 
Line 367 ⟶ 479:
}
}
}</langsyntaxhighlight>
 
=={{header|C++}}==
<syntaxhighlight lang="c++">#include <string>
#include <fstream>
 
using namespace std;
 
void truncateFile(string filename, int max_size) {
std::ifstream input( filename, std::ios::binary );
char buffer;
string outfile = filename + ".trunc";
ofstream appendFile(outfile, ios_base::out);
for(int i=0; i<max_size; i++) {
input.read( &buffer, sizeof(buffer) );
appendFile.write(&buffer,1);
}
appendFile.close(); }
 
int main () {
truncateFile("test.txt", 5);
return 0;
}
</syntaxhighlight>
 
=={{header|Clojure}}==
{{trans|Java}}
<syntaxhighlight lang="clojure">(defn truncate [file size]
(with-open [chan (.getChannel (java.io.FileOutputStream. file true))]
(.truncate chan size)))
 
(truncate "truncate_test.txt" 2)</syntaxhighlight>
 
=={{header|D}}==
<langsyntaxhighlight lang="d">import std.file, std.exception;
 
void truncateFile(in string name, in size_t newSize) {
Line 391 ⟶ 534:
void main() {
truncateFile("truncate_test.txt", 0);
}</langsyntaxhighlight>
 
=={{header|Delphi}}==
Line 397 ⟶ 540:
Delphi has the same <code>truncate</code> method as Pascal, which could be used like this:
 
<langsyntaxhighlight Delphilang="delphi">procedure TruncateFile(FileName : string; NewSize : integer);
var
aFile: file of byte;
Line 409 ⟶ 552:
Close(afile);
end;
end;</langsyntaxhighlight>
 
Most people nowadays seem to use streams to access files, so an alternative is:
 
<langsyntaxhighlight Delphilang="delphi">procedure TruncateFile(FileName : string; NewSize : integer);
var
Stream : TFileStream;
Line 423 ⟶ 566:
Stream.Free;
end;
end;</langsyntaxhighlight>
 
With both of these approaches, if the NewSize is greater than the existing file size the file will be expanded and filled with nulls.
Line 433 ⟶ 576:
If you try to truncate a non-existent file using a stream you will get an EFOpenError exception with the message:
Cannot open file "<File name with full path>. The system cannot find the file specified.
 
=={{header|Elena}}==
ELENA 6.x:
<lang elena>import system'io.
<syntaxhighlight lang="elena">import system'io;
import extensions.
import extensions;
file_info extension fileOp : File
{
set length:lengthLength(int len)
[{
streamauto stream := FileStream .openForEdit:(self.);
stream.Length set length:length.= len;
stream close.close()
]}
}
public program()
program =
{
[
if ('program'arguments lengthprogram_arguments.Length != 3)
[ { console .printLine:("Please provide the path to the file and a new length".); AbortException.raise() new}; raise ].
file_infoauto file := File new.assign('program'argumentsprogram_arguments[1]).;
var length := 'program'argumentsprogram_arguments[2] toInt.toInt();
ifnot (file isAvailable.Available)
[{ console .printLine("File ",file," does not exist"). AbortException new; AbortException.raise() ].};
file.Length set:= length:length.
}</syntaxhighlight>
].</lang>
 
=={{header|Erlang}}==
<syntaxhighlight lang="erlang">
<lang Erlang>
-module( truncate ).
 
Line 476 ⟶ 621:
{ok, Size} = file:position( IO, {bof, Size} ),
ok = file:truncate( IO ).
</syntaxhighlight>
</lang>
 
=={{header|F_Sharp|F#}}==
{{trans|C#}}
<langsyntaxhighlight lang="fsharp">open System
open System.IO
 
Line 492 ⟶ 637:
let main args =
truncateFile args.[0] (Int64.Parse(args.[1]))
0</langsyntaxhighlight>
 
=={{header|Go}}==
Go has the required function in the standard library. The implementation calls operating system specific functions and returns whatever errors the operating system reports.
<lang go>import (
"fmt"
"os"
)
 
if err := os.Truncate("filename", newSize); err != nil {
fmt.Println(err)
}</lang>
Package os also has a separate function that operates on an open file.
 
=={{header|Forth}}==
<syntaxhighlight lang="forth">
: truncate-file ( fname fnamelen fsize -- )
0 2swap r/w open-file throw
dup >r resize-file throw
r> close-file throw ;
</syntaxhighlight>
=={{header|Fortran}}==
Fortran offers no access to any facilities the file system may offer for truncating a disc file via standard language features, thus in the absence of special routines or deviant compilers that do, you're stuck.
Line 520 ⟶ 660:
There is an option to specify BUFFERED="YES" and BUFFERCOUNT=n or similar in many Fortrans, but alas, these are not standard even in F90/95. One's guilt is not so easily diverted, but, ... this is really only a demonstration, perhaps with very occasional use.
 
And so...<langsyntaxhighlight Fortranlang="fortran"> SUBROUTINE CROAK(GASP) !Something bad has happened.
CHARACTER*(*) GASP !As noted.
WRITE (6,*) "Oh dear. ",GASP !So, gasp away.
Line 565 ⟶ 705:
PROGRAM CHOPPER
CALL FILEHACK("foobar.txt",12)
END</langsyntaxhighlight>
 
=={{header|FreeBASIC}}==
{{trans|QuickBASIC}}
<syntaxhighlight lang="freebasic">Sub truncateFile (archivo As String, longitud As Long)
If Len(Dir(archivo)) Then
Dim f As Long, c As String
f = Freefile
Open archivo For Binary As #f
If longitud > Lof(f) Then
Close #f
Error 62 'Input past end of file
Else
c = Space(longitud)
Get #f, 1, c
Close f
Open archivo For Output As #f
Print #f, c;
Close #f
End If
Else
Error 53 'File not found
End If
End Sub</syntaxhighlight>
 
=={{header|Go}}==
Go has the required function in the standard library. The implementation calls operating system specific functions and returns whatever errors the operating system reports.
<syntaxhighlight lang="go">import (
"fmt"
"os"
)
 
if err := os.Truncate("filename", newSize); err != nil {
fmt.Println(err)
}</syntaxhighlight>
Package os also has a separate function that operates on an open file.
 
=={{header|Haskell}}==
This can be achieved by using the <code>setFileSize</code> function in [http://hackage.haskell.org/packages/archive/unix-compat/0.1.2.1/doc/html/System-PosixCompat-Files.html#13 System.PosixCompat.Files]:
 
<langsyntaxhighlight Haskelllang="haskell">setFileSize :: FilePath -> FileOffset -> IO ()
-- Truncates the file down to the specified length.
-- If the file was larger than the given length
-- before this operation was performed the extra is lost.
-- Note: calls truncate.
</syntaxhighlight>
</lang>
 
=={{header|Icon}} and {{header|Unicon}}==
Unicon provides the built-in function truncate which can be used to truncate a file. The following line of code truncates ''filename'' to ''newsizeinbytes''. The file is opened for both read and write in untranslated mode.
<langsyntaxhighlight Uniconlang="unicon">truncate(f := open(filename, "bu"), newsizeinbytes) & close(f)</langsyntaxhighlight>
Note: The Unicon book incorrectly indicates that truncate doesn't work on Windows.
 
=={{header|J}}==
'''Solution:'''
<langsyntaxhighlight lang="j">require 'files' NB. needed for versions prior to J7
ftruncate=: ] fwrite~ ] fread@; 0 , [</langsyntaxhighlight>
'''Usage:'''
<langsyntaxhighlight lang="j"> (1000$ 'abcdefg') fwrite 'text.txt' NB. create test file
567 ftruncate 'test.txt' NB. truncate test file
567
fsize 'test.txt' NB. check new file size
567</langsyntaxhighlight>
 
=={{header|Java}}==
The built-in function for truncating a file in Java will leave the file unchanged if the specified size is larger than the file. This version expects the source file name and the new size as command line arguments (in that order).
<langsyntaxhighlight lang="java">import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
Line 611 ⟶ 786:
outChan.close();
}
}</langsyntaxhighlight>
 
=={{header|jq}}==
jq cannot itself perform the specified task
because it cannot "truncate a file" in the sense of the question.
In particular, it is not "binary safe", and cannot itself write to files named on the command line.
 
Another issue is that jq can only read UTF-8-encoded files, and generally speaking is oriented
to codepoints rather than bytes.
 
So for this task, we'll assume that `sponge` is available for overwriting a file,
and that the "size" is specified in codepoints rather than bytes.
 
<pre>
< input.txt jq -Rr --argjson size $size '
if length < $size then "file size is less than the specified size" | error
else .[:$size]
end
' | sponge input.txt
</pre>
 
 
=={{header|Julia}}==
Uses the built-in <code>truncate</code> function (which truncates a stream):
<langsyntaxhighlight lang="julia">function truncate_file(fname, size):
open(fname, "r+") do f
truncate(f, size)
end
end</langsyntaxhighlight>
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.1.2
 
import java.io.FileOutputStream
Line 646 ⟶ 841:
fun main(args: Array<String>) {
truncateFile("test.txt", 10)
}</langsyntaxhighlight>
 
=={{header|Lasso}}==
<langsyntaxhighlight Lassolang="lasso">define file_truncate(path::string, size::integer) => {
 
local(file = file(#path))
Line 667 ⟶ 862:
 
stdoutnl(file(#filepath) -> readbytes)
stdout(file('Truncated size: ' + #filepath) -> size)</langsyntaxhighlight>
Output:
<pre>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat
Line 690 ⟶ 885:
<br>
It is also possible to call API functions to achieve this task.
<syntaxhighlight lang="lb">
<lang lb>
dim info$( 50, 50) ' NB pre-dimension before calling file-exists
' needed for file-exists function
Line 721 ⟶ 916:
 
end
</syntaxhighlight>
</lang>
 
=={{header|Lingo}}==
With native means (Fileio Xtra) file truncation can only be implemented indirectly, either using a temp file or loading truncated file contents into memory, deleting original and writing memory back to file:
<langsyntaxhighlight lang="lingo">----------------------------------------
-- Truncates file
-- @param {string} filename
Line 752 ⟶ 947:
fp.closeFile()
return ok
end</langsyntaxhighlight>
But there are also free plugins ("Xtras") like e.g. "BinFile Xtra" that support "in-file" truncation:
{{libheader|BinFile Xtra}}
<langsyntaxhighlight lang="lingo">-- truncates file to 10 KB length
bx_file_truncate(_movie.path&"foo.dat", 10240)</langsyntaxhighlight>
 
=={{header|Lua}}==
Lua treats strings as being invariably one byte per character (hence the awkwardness of trying to use it with unicode), so it's safe to use string methods to truncate binary data.
<langsyntaxhighlight Lualang="lua">function truncate (filename, length)
local inFile = io.open(filename, 'r')
if not inFile then
Line 773 ⟶ 968:
outFile:write(wholeFile:sub(1, length))
outFile:close()
end</langsyntaxhighlight>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">Truncate[file_, n_] := Module[{filename = file, nbbytes = n, temp},
temp = $TemporaryPrefix <> filename;
BinaryWrite[temp, BinaryReadList[filename, "Byte", nbbytes]];
Close[temp]; DeleteFile[filename]; RenameFile[temp, filename];
]</langsyntaxhighlight>
 
=={{header|MATLAB}} / {{header|Octave}}==
<langsyntaxhighlight MATLABlang="matlab">function truncate_a_file(fn,count);
 
fid=fopen(fn,'r');
Line 791 ⟶ 986:
fid=fopen(fn,'w');
s = fwrite(fid,s,'uint8');
fclose(fid); </langsyntaxhighlight>
 
=={{header|Nim}}==
Nim provides the module "posix" which allows to use the Posix functions in Nim programs. The behavior is that of the "truncate" Posix function. Especially, if the provided length is greater than the current file size, the file is expanded at the requested length with null bytes.
<lang nim>import posix
 
The function returns a code which can be checked to emit a message or raise an exception in case of error. In the following example, we ignore (discard) this return code.
discard truncate("filename", 1024)</lang>
 
<syntaxhighlight lang="nim">import posix
 
discard truncate("filename", 1024)</syntaxhighlight>
 
=={{header|OCaml}}==
Line 802 ⟶ 1,001:
The <code>Unix</code> module provided with the standard distribution provides a function <code>[http://caml.inria.fr/pub/docs/manual-ocaml/libref/Unix.html#VALtruncate truncate]</code>:
 
<langsyntaxhighlight lang="ocaml">val truncate : string -> int -> unit
(** Truncates the named file to the given size. *)</langsyntaxhighlight>
 
There is also a function <code>[http://caml.inria.fr/pub/docs/manual-ocaml/libref/Unix.html#VALftruncate ftruncate]</code> that does the equivalent operation but with a file descriptor instead of a file name:
 
<langsyntaxhighlight lang="ocaml">val ftruncate : file_descr -> int -> unit
(** Truncates the file corresponding to the given descriptor to the given size. *)</langsyntaxhighlight>
 
=={{header|PARI/GP}}==
 
Create a file /tmp/test.file and truncate to 20 bytes: (Linux only)
<langsyntaxhighlight lang="parigp">install("truncate", "isL", "trunc")
 
trunc("/tmp/test.file", 20)</langsyntaxhighlight>
 
=={{header|Pascal}}==
<langsyntaxhighlight lang="pascal">
Program FileTruncate;
 
Line 855 ⟶ 1,054:
writeln('File "', filename, '" truncated at position ', position, '.');
end.
</syntaxhighlight>
</lang>
Output:
<pre>
Line 864 ⟶ 1,063:
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl"># Open a file for writing, and truncate it to 1234 bytes.
open FOO, ">>file" or die;
truncate(FOO, 1234);
Line 870 ⟶ 1,069:
 
# Truncate a file to 567 bytes.
truncate("file", 567);</langsyntaxhighlight>
=={{header|Perl 6}}==
{{Works with|rakudo|2016.07}}
<lang perl6>use NativeCall;
 
=={{header|Phix}}==
sub truncate(Str, int32 --> int32) is native {*}
In honour of this very task, there is now (0.8.0+) a set_file_size() builtin, for the grubby/cross-platform details see builtins/pfile.e (an autoinclude)<br>
 
It will pad or truncate as needed.
sub MAIN (Str $file, Int $to) {
<!--<syntaxhighlight lang="phix">(notonline)-->
given $file.IO {
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span> <span style="color: #000080;font-style:italic;">-- (file i/o)</span>
.e or die "$file doesn't exist";
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">get_file_size</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"test.txt"</span><span style="color: #0000FF;">)</span>
.w or die "$file isn't writable";
<span style="color: #0000FF;">?</span><span style="color: #000000;">set_file_size</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"test.txt"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">100</span><span style="color: #0000FF;">)</span>
.s >= $to or die "$file is not big enough to truncate";
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">get_file_size</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"test.txt"</span><span style="color: #0000FF;">)</span>
}
<span style="color: #0000FF;">?</span><span style="color: #000000;">set_file_size</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"test.txt"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1024</span><span style="color: #0000FF;">)</span>
truncate($file, $to) == 0 or die "Truncation was unsuccessful";
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">get_file_size</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"test.txt"</span><span style="color: #0000FF;">)</span>
}</lang>
<!--</syntaxhighlight>-->
{{out}} (annotated, repeatable, assumes test.txt already exists)
<pre>
--1024
--1 (true)
--100
--1 (true)
--1024
</pre>
 
=={{header|PicoLisp}}==
On the 64-bit version, we can call the native runtime library:
<langsyntaxhighlight PicoLisplang="picolisp">(de truncate (File Len)
(native "@" "truncate" 'I File Len) )</langsyntaxhighlight>
Otherwise (on all versions), we call the external truncate command:
<langsyntaxhighlight PicoLisplang="picolisp">(de truncate (File Len)
(call "truncate" "-s" Len File) )</langsyntaxhighlight>
 
=={{header|PL/I}}==
<syntaxhighlight lang="text">
/* Parameters to be read in by the program are: */
/* 1. the name of the file to be truncated, and */
Line 924 ⟶ 1,129:
end;
end truncate_file;
</syntaxhighlight>
</lang>
 
=={{header|PowerBASIC}}==
Line 931 ⟶ 1,136:
While PowerBASIC can use the QuickBASIC version of <code>truncateFile</code>, PB provides an easier way to do this, via the <code>SETEOF</code> function -- but since <code>SETEOF</code> will extend a file if it is not as long as specified, we still need to wrap it in a <code>SUB</code> to meet this task's specifications.
 
<langsyntaxhighlight lang="powerbasic">SUB truncateFile (file AS STRING, length AS DWORD)
IF LEN(DIR$(file)) THEN
DIM f AS LONG
Line 947 ⟶ 1,152:
ERROR 53 'File not found
END IF
END SUB</langsyntaxhighlight>
 
=={{header|Powershell}}==
<syntaxhighlight lang="powershell">Function Truncate-File(fname) {
$null | Set-Content -Path "$fname"
}
</syntaxhighlight>
 
=={{header|PureBasic}}==
PureBasic has the internal function [http://www.purebasic.com/documentation/file/truncatefile.html TruncateFile] that cuts the file at the current file position and discards all data that follows.
<langsyntaxhighlight PureBasiclang="purebasic">Procedure SetFileSize(File$, length.q)
Protected fh, pos, i
If FileSize(File$) < length
Line 963 ⟶ 1,174:
EndIf
ProcedureReturn #True
EndProcedure</langsyntaxhighlight>
 
=={{header|Powershell}}==
<lang powershell>Function Truncate-File(fname) {
$null | Set-Content -Path "$fname"
}
</lang>
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">
def truncate_file(name, length):
if not os.path.isfile(name):
Line 981 ⟶ 1,186:
f.truncate(length)
return True
</syntaxhighlight>
</lang>
 
=={{header|R}}==
<syntaxhighlight lang="r">
truncate_file <- function(filename, n_bytes) {
# check file exists and size is greater than n_bytes
stopifnot(
"file does not exist"= file.exists(filename),
"not enough bytes in file"= file.size(filename) >= n_bytes
)
# read bytes from input file
input.con <- file(filename, "rb")
bindata <- readBin(input.con, integer(), n=n_bytes/4)
close(input.con)
# write bytes to temporary file
tmp.filename <- tempfile()
output.con <- file(tmp.filename, "wb")
writeBin(bindata, output.con)
close(output.con)
# double check that everything worked before overwriting original file
stopifnot(
"temp file is not expected size"= file.size(tmp.filename) == n_bytes
)
# overwrite input file with temporary file
file.rename(tmp.filename, filename)
}
</syntaxhighlight>
 
=={{header|Racket}}==
Line 987 ⟶ 1,224:
Racket has a <tt>file-truncate</tt> function that expects an open port and truncate its associated file. Note that it can also extend the file, and the code below prints a warning in that case.
 
<syntaxhighlight lang="racket">
<lang Racket>
#lang racket
 
Line 995 ⟶ 1,232:
(call-with-output-file* file #:exists 'update
(λ(o) (file-truncate o size))))
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
(formerly Perl 6)
{{Works with|rakudo|2016.07}}
<syntaxhighlight lang="raku" line>use NativeCall;
 
sub truncate(Str, int32 --> int32) is native {*}
 
sub MAIN (Str $file, Int $to) {
given $file.IO {
.e or die "$file doesn't exist";
.w or die "$file isn't writable";
.s >= $to or die "$file is not big enough to truncate";
}
truncate($file, $to) == 0 or die "Truncation was unsuccessful";
}</syntaxhighlight>
 
The external <code>truncate</code> routine could be replaced with the following line (in which case no need for <code>NativeCall</code>):
<syntaxhighlight lang="raku" line>spurt $file, slurp($file).substr($to);</syntaxhighlight>
 
=={{header|REXX}}==
Line 1,006 ⟶ 1,262:
::::* &nbsp; then erased (deleted),
::::* &nbsp; then written to.
<langsyntaxhighlight lang="rexx">/*REXX program truncates a file to a specified (and smaller) number of bytes. */
parse arg siz FID /*obtain required arguments from the CL*/
FID=strip(FID) /*elide FID leading/trailing blanks. */
Line 1,025 ⟶ 1,281:
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
ser: say '***error***' arg(1); exit 13 /*display an error message and exit. */</langsyntaxhighlight>
For this example, Windows/XP and Windows 7 operating systems were used, the program was tested with:
:::* &nbsp; Personal REXX
Line 1,039 ⟶ 1,295:
 
===with memory constraints===
<langsyntaxhighlight lang="rexx">/*REXX program truncates a file to a specified (and smaller) number of bytes. */
parse arg siz FID /*obtain required arguments from the CL*/
FID=strip(FID) /*elide FID leading/trailing blanks. */
Line 1,065 ⟶ 1,321:
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
ser: say '***error***' arg(1); exit 13 /*display an error message and exit. */</langsyntaxhighlight>
'''output''' &nbsp; is identical to the 1<sup>st</sup> REXX version. <br><br>
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
file = "C:\Ring\ReadMe.txt"
fp = read(file)
Line 1,075 ⟶ 1,331:
see fpstr + nl
write(file, fpstr)
</syntaxhighlight>
</lang>
Output:
<pre>
Line 1,087 ⟶ 1,343:
This only works with some platforms. If truncation is not available, then Ruby raises NotImplementedError.
 
<langsyntaxhighlight lang="ruby"># Open a file for writing, and truncate it to 1234 bytes.
File.open("file", "ab") do |f|
f.truncate(1234)
Line 1,094 ⟶ 1,350:
 
# Just truncate a file to 567 bytes.
File.truncate("file", 567)</langsyntaxhighlight>
 
=={{header|Rust}}==
<syntaxhighlight lang="rust">use std::path::Path;
use std::fs;
 
fn truncate_file<P: AsRef<Path>>(filename: P, filesize: usize) -> Result<(), Error> {
use Error::*;
let file = fs::read(&filename).or(Err(NotFound))?;
 
if filesize > file.len() {
return Err(FilesizeTooSmall)
}
 
fs::write(&filename, &file[..filesize]).or(Err(UnableToWrite))?;
Ok(())
}
 
#[derive(Debug)]
enum Error {
/// File not found
NotFound,
/// Truncated size would be larger than the current size
FilesizeTooSmall,
/// Likely due to having read but not write permissions
UnableToWrite,
}</syntaxhighlight>
 
=={{header|Scala}}==
{{libheader|Scala}}<langsyntaxhighlight Scalalang="scala">import java.io.FileOutputStream
 
object TruncFile extends App {
Line 1,106 ⟶ 1,388:
outChan.truncate(newSize)
}
}</langsyntaxhighlight>
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">func truncate(filename, len) {
var file = File(filename);
len > file.size ->
Line 1,117 ⟶ 1,399:
 
# truncate "file.ext" to 1234 bytes
truncate("file.ext", 1234);</langsyntaxhighlight>
 
=={{header|Standard ML}}==
{{works with|Unix}}
This function behaves similarly to the ''truncate'' tool from the [[GNU]] coreutils: If the file does not exist yet, or the target length is larger than the current file size, the extended area appears zero-filled (usually resulting in a sparse file).
<syntaxhighlight lang="sml">local
open Posix.FileSys
val perm = S.flags [S.irusr, S.iwusr, S.irgrp, S.iwgrp, S.iroth, S.iwoth]
in
fun truncate (path, len) =
let
val fd = createf (path, O_WRONLY, O.noctty, perm)
in
ftruncate (fd, len); Posix.IO.close fd
end
end</syntaxhighlight>
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">package require Tcl 8.5
 
set f [open "file" r+]; # Truncation is done on channels
chan truncate $f 1234; # Truncate at a particular length (in bytes)
close $f</langsyntaxhighlight>
 
=={{header|UNIX Shell}}==
The dd(1) command can truncate a file. Because dd(1) would create the file, this example runs ls(1). If the file does not exist, then ls(1) prints an error. If the file exists, then dd(1) truncates the file or prints an error. Unix can extend a file, so there is no error if the length increases.
 
<langsyntaxhighlight lang="bash"># Truncate a file named "myfile" to 1440 kilobytes.
ls myfile >/dev/null &&
dd if=/dev/null of=myfile bs=1 seek=1440k</langsyntaxhighlight>
 
----
Some systems have a truncate(1) command ([http://www.freebsd.org/cgi/man.cgi?query=truncate&apropos=0&sektion=0&manpath=FreeBSD+8.2-RELEASE&format=html FreeBSD truncate(1)], [http://www.gnu.org/software/coreutils/manual/html_node/truncate-invocation.html#truncate-invocation GNU truncate(1)]).
 
<langsyntaxhighlight lang="bash"># Truncate a file named "myfile" to 1440 kilobytes.
truncate -s 1440k myfile</langsyntaxhighlight>
 
----
Pure bourne-shell approach (cross-OS, no truncate(1) binary required)
<langsyntaxhighlight lang="bash">
# 1. simplest one-liner
-bash$ >file
Line 1,229 ⟶ 1,526:
abc+ echo _EOF_
_EOF_
</syntaxhighlight>
</lang>
 
NOTE[4]: Designed for regular text files. Does not work when files contain: chars 0x00 and 0xFF as of bash 4.2 - these chars are treated differently in read -N. For this reason use of method#4 is not prefer over dd(1) or truncate(1) when using binary files, or large files. [4b] http://unix.stackexchange.com/questions/8618/script-that-keep-reading-a-stream,[4a] https://groups.google.com/forum/#!topic/gnu.bash.bug/a2rjQHpQYSU
 
=={{header|VBScript}}==
<syntaxhighlight lang="vb">
<lang vb>
Sub truncate(fpath,n)
'Check if file exist
Line 1,274 ⟶ 1,571:
'testing
Call truncate("C:\temp\test.txt",30)
</syntaxhighlight>
</lang>
 
=={{header|Wren}}==
{{libheader|Wren-ioutil}}
<syntaxhighlight lang="wren">import "./ioutil" for FileUtil
 
var fileName = "temp.txt"
 
// create a file of length 26 bytes
FileUtil.write(fileName, "abcdefghijklmnopqrstuvwxyz")
System.print("Contents before truncation: %(FileUtil.read(fileName))")
 
// truncate file to 13 bytes
FileUtil.truncate(fileName, 13)
System.print("Contents after truncation : %(FileUtil.read(fileName))")
 
// attempt to truncate file to 20 bytes
FileUtil.truncate(fileName, 20)
System.print("Contents are still : %(FileUtil.read(fileName))")</syntaxhighlight>
 
{{out}}
<pre>
Contents before truncation: abcdefghijklmnopqrstuvwxyz
Contents after truncation : abcdefghijklm
Contents are still : abcdefghijklm
</pre>
 
=={{header|XPL0}}==
Works for binary files.
<syntaxhighlight lang="xpl0">int I, Size, FD;
char C, FN(80), Array;
[I:= 0; \get file name from command line
loop [C:= ChIn(8);
if C = $20 \space\ then quit;
FN(I):= C;
I:= I+1;
];
FN(I):= 0;
Size:= IntIn(8); \get number of bytes from command line
if Size = 0 then [Text(0, "Length not found (or zero)"); exit 1];
 
Trap(false); \disable abort on errors
FD:= FOpen(FN, 0); \open specified file for input
FSet(FD, ^i);
OpenI(3);
if GetErr then [Text(0, "File not found"); exit 1];
 
Array:= Reserve(0); \64MB available if no procedures are called
for I:= 0 to Size-1 do \read specified number of bytes
[Array(I):= ChIn(3);
if GetErr then [Text(0, "File is too short"); exit 1];
]; \if end of file encountered, show error
FClose(FD);
 
FD:= FOpen(FN, 1); \open file by same name for output
FSet(FD, ^o);
OpenO(3);
if GetErr then [Text(0, "Output error"); exit 1];
for I:= 0 to Size-1 do ChOut(3, Array(I));
Close(3);
]</syntaxhighlight>
 
=={{header|ZX Spectrum Basic}}==
Line 1,280 ⟶ 1,637:
We can truncate files that were saved as binary. We don't know the length of the original file, so if the provided length is longer, then the file will be extended.
 
<langsyntaxhighlight lang="zxbasic">10 CLEAR 29999
20 INPUT "Which file do you want to truncate?";f$
30 PRINT "Start tape to load file to truncate."
Line 1,287 ⟶ 1,644:
60 PRINT "Please rewind the tape and press record."
70 SAVE f$ CODE 30000,n
80 STOP</langsyntaxhighlight>
 
{{omit from|GUISS}}
1

edit