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-2025 The Mercury team. % This file is distributed under the terms specified in COPYING.LIB. %--------------------------------------------------% % % File: io.file.m. % Stability: high. % % 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): % % Attempt to remove the file FileName, binding Result to ok/0 % if this 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): % % Attempt to remove the file FileName, binding Result to ok/0 % if this 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): % % Attempt to rename the file or directory OldFileName as NewFileName, % binding Result to ok/0 if this 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. %--------------------------------------------------% % Succeed if and only if the current 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): % % Return ok(LinkTarget) if FileName is a symbolic link % pointing to LinkTarget, and error(Error) otherwise. % % If the returned LinkTarget is a relative path, it should be interpreted % relative to the directory containing FileName, not % relative to 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 % that 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): % % Return 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): % % Return the time of the last modification to the contents % 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): % % Create an empty file whose name differs from the name of % any existing file. The file will be placed in the directory % specified by get_temp_directory/3. % % If successful, return the name of the file in Result. % % It is the responsibility of the caller to delete the file % when it is no longer required. % :- pred make_temp_file(io.res(string)::out, io::di, io::uo) is det. % make_temp_file(Dir, Prefix, Suffix, Result, !IO): % % Create an empty file whose name is differs from 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. % % The reason for truncating Prefix is historical, and in future, % the behaviour may be changed. % % Note that the truncation is done without regard for the boundaries % between code points. We recommend that the prefix should contain % only printable ASCII characters. % % 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. % % It is the responsibility of the caller to delete the file % when it is no longer required. % :- 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): % % Create an empty directory whose name differs 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): % % Create an empty directory whose name differs 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 caller to delete the directory % when it is no longer required. % % 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, DirName will be set % - to the directory named by the TMP environment variable, % if that environment variable exists and names a directory, and % - to the current directory otherwise. % % - On Unix systems, DirName will be set % - to the directory named by the TMPDIR environment variable, % if that environment variable exists and names a directory, and % - to the /tmp directory otherwise. % % 2. For the Java back-end, DirName will be set to the system-dependent % default temporary-file directory, specified by the Java system % property java.io.tmpdir. % % - On Microsoft Windows systems, the default value of this property % is typically "c:\\temp". % % - On UNIX systems, the default value of this property % is typically "/tmp" or "/var/tmp". % :- pred get_temp_directory(string::out, io::di, io::uo) is det. %--------------------------------------------------% %--------------------------------------------------%
Next: kv_list, Previous: io.environment, Up: Top [Contents]