-
Notifications
You must be signed in to change notification settings - Fork 76
/
filename.mli
241 lines (197 loc) · 10 KB
/
filename.mli
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
# 2 "filename.mli"
(**************************************************************************)
(* *)
(* OCaml *)
(* *)
(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
(* *)
(* Copyright 1996 Institut National de Recherche en Informatique et *)
(* en Automatique. *)
(* *)
(* All rights reserved. This file is distributed under the terms of *)
(* the GNU Lesser General Public License version 2.1, with the *)
(* special exception on linking described in the file LICENSE. *)
(* *)
(**************************************************************************)
open! Stdlib
(** Operations on file names. *)
val current_dir_name : string
(** The conventional name for the current directory (e.g. [.] in Unix). *)
val parent_dir_name : string
(** The conventional name for the parent of the current directory
(e.g. [..] in Unix). *)
val dir_sep : string
(** The directory separator (e.g. [/] in Unix).
@since 3.11.2 *)
val concat : string -> string -> string
(** [concat dir file] returns a file name that designates file
[file] in directory [dir]. *)
val is_relative : string -> bool
(** Return [true] if the file name is relative to the current
directory, [false] if it is absolute (i.e. in Unix, starts
with [/]). *)
val is_implicit : string -> bool
(** Return [true] if the file name is relative and does not start
with an explicit reference to the current directory ([./] or
[../] in Unix), [false] if it starts with an explicit reference
to the root directory or the current directory. *)
val check_suffix : string -> string -> bool
(** [check_suffix name suff] returns [true] if the filename [name]
ends with the suffix [suff].
Under Windows ports (including Cygwin), comparison is
case-insensitive, relying on [String.lowercase_ascii]. Note that
this does not match exactly the interpretation of case-insensitive
filename equivalence from Windows. *)
val chop_suffix : string -> string -> string
(** [chop_suffix name suff] removes the suffix [suff] from
the filename [name].
@raise Invalid_argument if [name] does not end with the suffix [suff].
*)
val chop_suffix_opt: suffix:string -> string -> string option
(** [chop_suffix_opt ~suffix filename] removes the suffix from
the [filename] if possible, or returns [None] if the
filename does not end with the suffix.
Under Windows ports (including Cygwin), comparison is
case-insensitive, relying on [String.lowercase_ascii]. Note that
this does not match exactly the interpretation of case-insensitive
filename equivalence from Windows.
@since 4.08
*)
val extension : string -> string
(** [extension name] is the shortest suffix [ext] of [name0] where:
- [name0] is the longest suffix of [name] that does not
contain a directory separator;
- [ext] starts with a period;
- [ext] is preceded by at least one non-period character
in [name0].
If such a suffix does not exist, [extension name] is the empty
string.
@since 4.04
*)
val remove_extension : string -> string
(** Return the given file name without its extension, as defined
in {!Filename.extension}. If the extension is empty, the function
returns the given file name.
The following invariant holds for any file name [s]:
[remove_extension s ^ extension s = s]
@since 4.04
*)
val chop_extension : string -> string
(** Same as {!Filename.remove_extension}, but raise [Invalid_argument]
if the given name has an empty extension. *)
val basename : string -> string
(** Split a file name into directory name / base file name.
If [name] is a valid file name, then [concat (dirname name) (basename name)]
returns a file name which is equivalent to [name]. Moreover,
after setting the current directory to [dirname name] (with {!Sys.chdir}),
references to [basename name] (which is a relative file name)
designate the same file as [name] before the call to {!Sys.chdir}.
This function conforms to the specification of POSIX.1-2008 for the
[basename] utility. *)
val dirname : string -> string
(** See {!Filename.basename}.
This function conforms to the specification of POSIX.1-2008 for the
[dirname] utility. *)
val null : string
(** [null] is ["/dev/null"] on POSIX and ["NUL"] on Windows. It represents a
file on the OS that discards all writes and returns end of file on reads.
@since 4.10 *)
val temp_file : ?temp_dir: string -> string -> string -> string
(** [temp_file prefix suffix] returns the name of a
fresh temporary file in the temporary directory.
The base name of the temporary file is formed by concatenating
[prefix], then a suitably chosen integer number, then [suffix].
The optional argument [temp_dir] indicates the temporary directory
to use, defaulting to the current result of {!Filename.get_temp_dir_name}.
The temporary file is created empty, with permissions [0o600]
(readable and writable only by the file owner). The file is
guaranteed to be different from any other file that existed when
[temp_file] was called.
@raise Sys_error if the file could not be created.
@before 3.11.2 no ?temp_dir optional argument
*)
val open_temp_file :
?mode: open_flag list -> ?perms: int -> ?temp_dir: string -> string ->
string -> string * out_channel
(** Same as {!Filename.temp_file}, but returns both the name of a fresh
temporary file, and an output channel opened (atomically) on
this file. This function is more secure than [temp_file]: there
is no risk that the temporary file will be modified (e.g. replaced
by a symbolic link) before the program opens it. The optional argument
[mode] is a list of additional flags to control the opening of the file.
It can contain one or several of [Open_append], [Open_binary],
and [Open_text]. The default is [[Open_text]] (open in text mode). The
file is created with permissions [perms] (defaults to readable and
writable only by the file owner, [0o600]).
@raise Sys_error if the file could not be opened.
@before 4.03 no ?perms optional argument
@before 3.11.2 no ?temp_dir optional argument
*)
val temp_dir : ?temp_dir: string -> ?perms:int -> string -> string -> string
(** [temp_dir prefix suffix] creates and returns the name of a fresh
temporary directory with permissions [perms] (defaults to 0o700)
inside [temp_dir]. The base name of the temporary directory is
formed by concatenating [prefix], then a suitably chosen integer
number, then [suffix]. The optional argument [temp_dir] indicates
the temporary directory to use, defaulting to the current result of
{!Filename.get_temp_dir_name}. The temporary directory is created
empty, with permissions [0o700] (readable, writable, and searchable
only by the file owner). The directory is guaranteed to be
different from any other directory that existed when [temp_dir] was
called.
If temp_dir does not exist, this function does not create it. Instead,
it raises Sys_error.
@raise Sys_error if the directory could not be created.
@since 5.1
*)
val get_temp_dir_name : unit -> string
(** The name of the temporary directory:
Under Unix, the value of the [TMPDIR] environment variable, or "/tmp"
if the variable is not set.
Under Windows, the value of the [TEMP] environment variable, or "."
if the variable is not set.
The temporary directory can be changed with {!Filename.set_temp_dir_name}.
@since 4.00
*)
val set_temp_dir_name : string -> unit
(** Change the temporary directory returned by {!Filename.get_temp_dir_name}
and used by {!Filename.temp_file} and {!Filename.open_temp_file}.
The temporary directory is a domain-local value which is inherited
by child domains.
@since 4.00
*)
val quote : string -> string
(** Return a quoted version of a file name, suitable for use as
one argument in a command line, escaping all meta-characters.
Warning: under Windows, the output is only suitable for use
with programs that follow the standard Windows quoting
conventions.
*)
val quote_command :
string -> ?stdin:string -> ?stdout:string -> ?stderr:string
-> string list -> string
(** [quote_command cmd args] returns a quoted command line, suitable
for use as an argument to {!Sys.command}, {!Unix.system}, and the
{!Unix.open_process} functions.
The string [cmd] is the command to call. The list [args] is
the list of arguments to pass to this command. It can be empty.
The optional arguments [?stdin] and [?stdout] and [?stderr] are
file names used to redirect the standard input, the standard
output, or the standard error of the command.
If [~stdin:f] is given, a redirection [< f] is performed and the
standard input of the command reads from file [f].
If [~stdout:f] is given, a redirection [> f] is performed and the
standard output of the command is written to file [f].
If [~stderr:f] is given, a redirection [2> f] is performed and the
standard error of the command is written to file [f].
If both [~stdout:f] and [~stderr:f] are given, with the exact
same file name [f], a [2>&1] redirection is performed so that the
standard output and the standard error of the command are interleaved
and redirected to the same file [f].
Under Unix and Cygwin, the command, the arguments, and the redirections
if any are quoted using {!Filename.quote}, then concatenated.
Under Win32, additional quoting is performed as required by the
[cmd.exe] shell that is called by {!Sys.command}.
@raise Failure if the command cannot be escaped on the current platform.
@since 4.10
*)