Next: kv_list, Previous: io.environment, Up: Top [Contents]
%--------------------------------------------------% % vim: ft=mercury ts=4 sw=4 et %--------------------------------------------------% % Copyright (C) 1993-2012 The University of Melbourne. % Copyright (C) 2013-2024 The Mercury team. % This file is distributed under the terms specified in COPYING.LIB. %--------------------------------------------------% % % File: io.file.m. % % This module provides operations on files other than input/output. % %--------------------------------------------------% %--------------------------------------------------% :- module io.file. :- interface. :- import_module time. %--------------------------------------------------% % % File handling predicates. % % remove_file(FileName, Result, !IO) attempts to remove the file % FileName, binding Result to ok/0 if it succeeds, or error/1 if it % fails. If FileName names a file that is currently open, the behaviour % is implementation-dependent. % % If FileName names a directory, the behavior is currently % implementation-dependent. On most platforms, an empty directory will be % deleted. % :- pred remove_file(string::in, io.res::out, io::di, io::uo) is det. % remove_file_recursively(FileName, Result, !IO) attempts to remove % the file FileName, binding Result to ok/0 if it succeeds, or error/1 % if it fails. If FileName names a file that is currently open, the % behaviour is implementation-dependent. % % Unlike remove_file, this predicate will attempt to remove non-empty % directories (recursively). If it fails, some of the directory elements % may already have been removed. % :- pred remove_file_recursively(string::in, io.res::out, io::di, io::uo) is det. % rename_file(OldFileName, NewFileName, Result, !IO). % % Attempts to rename the file or directory OldFileName as NewFileName, % binding Result to ok/0 if it succeeds, or error/1 if it fails. % If OldFileName names a file that is currently open, the behaviour is % implementation-dependent. If NewFileName names a file that already % exists the behaviour is also implementation-dependent; on some systems, % the file previously named NewFileName will be deleted and replaced % with the file previously named OldFileName. % :- pred rename_file(string::in, string::in, io.res::out, io::di, io::uo) is det. %--------------------------------------------------% % Succeeds if this platform can read and create symbolic links. % :- pred have_symlinks is semidet. % make_symlink(FileName, LinkFileName, Result, !IO). % % Attempts to make LinkFileName be a symbolic link to FileName. % If FileName is a relative path, it is interpreted relative % to the directory containing LinkFileName. % :- pred make_symlink(string::in, string::in, io.res::out, io::di, io::uo) is det. % read_symlink(FileName, Result, !IO) returns `ok(LinkTarget)' % if FileName is a symbolic link pointing to LinkTarget, and % `error(Error)' otherwise. If LinkTarget is a relative path, % it should be interpreted relative the directory containing FileName, % not the current directory. % :- pred read_symlink(string::in, io.res(string)::out, io::di, io::uo) is det. %--------------------------------------------------% % check_file_accessibility(FileName, AccessTypes, Result): % % Check whether the current process can perform the operations given % in AccessTypes on FileName. % % The C# implementation is limited: % % - The "execute" access check passes for a regular file if we can read % from the file, and have unrestricted permissions to execute unmanaged % code. % % - The "write" access check passes for a directory if the directory does % not have the ReadOnly attribute, which does not necessarily mean we can % write to it. % % - The "execute" access check is ignored for directories. % :- pred check_file_accessibility(string::in, list(access_type)::in, io.res::out, io::di, io::uo) is det. % file_type(FollowSymLinks, FileName, TypeResult) % finds the type of the given file. % :- pred file_type(bool::in, string::in, io.res(file_type)::out, io::di, io::uo) is det. % file_modification_time(FileName, TimeResult) % finds the last modification time of the given file. % :- pred file_modification_time(string::in, io.res(time_t)::out, io::di, io::uo) is det. %--------------------------------------------------% % % Predicates for handling temporary files. % % make_temp_file(Result, !IO) creates an empty file whose name is different % to the name of any existing file. If successful Result returns the name % of the file. It is the responsibility of the caller to delete the file % when it is no longer required. % % The file is placed in the directory returned by get_temp_directory/3. % :- pred make_temp_file(io.res(string)::out, io::di, io::uo) is det. % make_temp_file(Dir, Prefix, Suffix, Result, !IO) creates an empty file % whose name is different to the name of any existing file. The file will % reside in the directory specified by Dir and will have a prefix using up % to the first 5 code units of Prefix. If successful, Result returns the % name of the file. It is the responsibility of the caller to delete the % file when it is no longer required. % % The reason for truncating Prefix is historical; in future the behaviour % may be changed. Note that the truncation is performed without regard for % code point boundaries. It is recommended to use only (printable) ASCII % characters in the prefix string. % % The C backend has the following limitations: % - Suffix may be ignored. % % The C# backend has the following limitations: % - Dir is ignored. % - Prefix is ignored. % - Suffix is ignored. % :- pred make_temp_file(string::in, string::in, string::in, io.res(string)::out, io::di, io::uo) is det. % make_temp_directory(Result, !IO) creates an empty directory whose name % is different from the name of any existing directory. % :- pred make_temp_directory(io.res(string)::out, io::di, io::uo) is det. % make_temp_directory(ParentDirName, Prefix, Suffix, Result, !IO) creates % an empty directory whose name is different from the name of any existing % directory. The new directory will reside in the existing directory % specified by ParentDirName and will have a prefix using up to the % first 5 characters of Prefix and a Suffix. Result returns the name of the % new directory. It is the responsibility of the program to delete the % directory when it is no longer needed. % % The C backend has the following limitations: % - Suffix is ignored. % % The C# backend has the following limitations: % - Prefix is ignored. % - Suffix is ignored. % % The Java backend has the following limitation: % - Suffix is ignored. % :- pred make_temp_directory(string::in, string::in, string::in, io.res(string)::out, io::di, io::uo) is det. % Test if the make_temp_directory predicates are available. % This is false for C backends without support for mkdtemp(3). % :- pred have_make_temp_directory is semidet. % get_temp_directory(DirName, !IO) % % DirName is the name of a directory where applications should put % temporary files. % % This is implementation-dependent. For current Mercury implementations, % it is determined as follows: % 1. For the non-Java back-ends: % - On Microsoft Windows systems, the file will reside in % the current directory if the TMP environment variable % is not set, or in the directory specified by TMP if it is set. % - On Unix systems, the file will reside in /tmp if the TMPDIR % environment variable is not set, or in the directory specified % by TMPDIR if it is set. % 2. For the Java back-end, the system-dependent default % temporary-file directory will be used, specified by the Java % system property java.io.tmpdir. On UNIX systems the default % value of this property is typically "/tmp" or "/var/tmp"; % on Microsoft Windows systems it is typically "c:\\temp". % :- pred get_temp_directory(string::out, io::di, io::uo) is det. %--------------------------------------------------% %--------------------------------------------------%
Next: kv_list, Previous: io.environment, Up: Top [Contents]