查看源代码 filelib (stdlib v6.2)
文件工具,例如文件名的通配符匹配。
此模块包含比 file
模块更高级的实用工具。
此模块不支持“原始”文件名(即,名称不符合预期编码的文件)。此模块中的函数会忽略此类文件。
有关原始文件名的更多信息,请参见 file
模块。
注意
此模块中的功能通常假设输入有效,并且不一定会在使用无效编码的输入上失败,但很可能会产生无效的输出。
文件操作过去接受包含空字符(整数值零)的文件名。这会导致名称被截断,并且在某些情况下会混淆原始操作的参数。现在拒绝在文件名内部包含空字符的文件名,并会导致原始文件操作失败。
警告
目前,原始文件操作将接受文件名末尾的空字符。但是,此类文件名仍然被记录为无效。该实现将来也会更改并拒绝此类文件名。
摘要
函数
确保指定文件或目录名称 Name
的所有父目录都存在,并在必要时尝试创建它们。
确保指定路径 Path
的所有父目录都存在,并在必要时尝试创建它们。
返回指定文件的大小。
通过将后缀规则应用于给定的目录路径来查找具有给定名称的文件。
等效于 find_source(Base, Dir)
,其中 Dir
是 filename:dirname(FilePath)
,Base
是 filename:basename(FilePath)
。
应用特定于文件扩展名的规则,以查找相对于对象目录的给定对象文件的源文件。
对目录 Dir
中所有(常规)文件 F
(其基本名称(例如,"foo/bar/baz.erl"
中的 "baz.erl"
)与正则表达式 RegExp
匹配)执行函数 Fun
的折叠操作(有关允许的正则表达式的描述,请参见 re
模块)。
如果 Name
指的是目录,则返回 true
,否则返回 false
。
如果 Name
指的是文件或目录,则返回 true
,否则返回 false
。
如果 Name
指的是(常规)文件,则返回 true
,否则返回 false
。
返回上次修改指定文件或目录的日期和时间,如果该文件不存在,则返回 0
。
通过消除“..”和“.”组件来清理相对路径,以防止目录遍历攻击。
返回与 Unix 样式通配符字符串 Wildcard
匹配的所有文件的列表。
与 wildcard/1
相同,不同之处在于使用 Cwd
代替工作目录。
类型
-type dirname() :: filename().
-type dirname_all() :: filename_all().
-type filename() :: file:name().
-type filename_all() :: file:name_all().
-type find_source_rule() :: {ObjExtension :: string(), SrcExtension :: string(), [find_file_rule()]}.
函数
-spec ensure_dir(Name) -> ok | {error, Reason} when Name :: filename_all() | dirname_all(), Reason :: file:posix().
确保指定文件或目录名称 Name
的所有父目录都存在,并在必要时尝试创建它们。
如果所有父目录都已存在或可以创建,则返回 ok
。如果某些父目录不存在且无法创建,则返回 {error, Reason}
。
-spec ensure_path(Path) -> ok | {error, Reason} when Path :: dirname_all(), Reason :: file:posix().
确保指定路径 Path
的所有父目录都存在,并在必要时尝试创建它们。
与 ensure_dir/1
不同,此函数将尝试将所有路径段作为目录创建,包括最后一个段。
如果所有父目录都已存在或可以创建,则返回 ok
。如果某些父目录不存在且无法创建,则返回 {error, Reason}
。
-spec file_size(Filename) -> non_neg_integer() when Filename :: filename_all().
返回指定文件的大小。
-spec find_file(filename(), filename(), [find_file_rule()]) -> {ok, filename()} | {error, not_found}.
通过将后缀规则应用于给定的目录路径来查找具有给定名称的文件。
例如,规则 {"ebin", "src"}
表示如果目录路径以 "ebin"
结尾,则应搜索以 "src"
结尾的相应路径。
如果省略 Rules
或为空列表,则使用默认的系统规则。另请参见 Kernel 应用程序参数 source_search_rules
。
等效于 find_source(Base, Dir)
,其中 Dir
是 filename:dirname(FilePath)
,Base
是 filename:basename(FilePath)
。
-spec find_source(filename(), filename(), [find_source_rule()]) -> {ok, filename()} | {error, not_found}.
应用特定于文件扩展名的规则,以查找相对于对象目录的给定对象文件的源文件。
例如,对于扩展名为 .beam
的文件,默认规则是通过将对象目录路径的后缀 "ebin"
替换为 "src"
或 "src/*"
来查找具有相应扩展名 .erl
的文件。文件搜索是通过 find_file/3
完成的。始终在规则指定的任何其他目录之前尝试对象文件的目录。
如果省略 Rules
或为空列表,则使用默认的系统规则。另请参见 Kernel 应用程序参数 source_search_rules
。
-spec fold_files(Dir, RegExp, Recursive, Fun, AccIn) -> AccOut when Dir :: dirname(), RegExp :: string(), Recursive :: boolean(), Fun :: fun((F :: file:filename(), AccIn) -> AccOut), AccIn :: term(), AccOut :: term().
对目录 Dir
中所有(常规)文件 F
(其基本名称(例如,"foo/bar/baz.erl"
中的 "baz.erl"
)与正则表达式 RegExp
匹配)执行函数 Fun
的折叠操作(有关允许的正则表达式的描述,请参见 re
模块)。
如果 Recursive
为 true
,则会处理 Dir
的所有子目录。正则表达式匹配仅在不包含目录部分的文件名上进行。
如果 Unicode 文件名转换生效并且文件系统是透明的,则可能会遇到无法解释为 Unicode 的文件名,在这种情况下,fun()
必须准备好处理原始文件名(即二进制文件)。如果正则表达式包含码位 > 255,则它与不符合预期字符编码(即未以有效的 UTF-8 编码)的文件名不匹配。
有关原始文件名的更多信息,请参见 file
模块。
-spec is_dir(Name) -> boolean() when Name :: filename_all() | dirname_all().
如果 Name
指的是目录,则返回 true
,否则返回 false
。
-spec is_file(Name) -> boolean() when Name :: filename_all() | dirname_all().
如果 Name
指的是文件或目录,则返回 true
,否则返回 false
。
-spec is_regular(Name) -> boolean() when Name :: filename_all().
如果 Name
指的是(常规)文件,则返回 true
,否则返回 false
。
-spec last_modified(Name) -> file:date_time() | 0 when Name :: filename_all() | dirname_all().
返回上次修改指定文件或目录的日期和时间,如果该文件不存在,则返回 0
。
-spec safe_relative_path(Filename, Cwd) -> unsafe | SafeFilename when Filename :: filename_all(), Cwd :: filename_all(), SafeFilename :: filename_all().
通过消除“..”和“.”组件来清理相对路径,以防止目录遍历攻击。
返回清理后的路径名,如果路径不安全,则返回原子 unsafe
。在以下情况下,该路径被认为是不安全的:
- 该路径不是相对路径。
- “..”组件会爬升到相对路径的根目录之上。
- 路径中的符号链接指向相对路径的根目录之上。
示例
1> {ok, Cwd} = file:get_cwd().
...
2> filelib:safe_relative_path("dir/sub_dir/..", Cwd).
"dir"
3> filelib:safe_relative_path("dir/..", Cwd).
[]
4> filelib:safe_relative_path("dir/../..", Cwd).
unsafe
5> filelib:safe_relative_path("/abs/path", Cwd).
unsafe
-spec wildcard(Wildcard) -> [file:filename()] when Wildcard :: filename() | dirname().
返回与 Unix 样式通配符字符串 Wildcard
匹配的所有文件的列表。
通配符字符串看起来像一个普通文件名,只是以下“通配符”以特殊方式解释:
? - 匹配一个字符。
* - 匹配任意数量的字符,直到文件名末尾、下一个点或下一个斜杠。
** - 两个相邻的
*
用作单个模式,匹配所有文件以及零个或多个目录和子目录。[Character1,Character2,...] - 匹配列出的任何字符。由连字符分隔的两个字符匹配一系列字符。示例:
[A-Z]
匹配任何大写字母。{Item,...} - 替换。匹配其中一个替代项。
其他字符代表它们自己。只有在相同位置具有完全相同字符的文件名才匹配。匹配区分大小写,例如,“a”不匹配“A”。
目录分隔符必须始终写为 /
,即使在 Windows 上也是如此。
以 \
开头的字符会失去其特殊含义。请注意,在字符串文字中,\
必须写为 \\
。例如,"\\?*" 将匹配任何以 ?
开头的文件名。
请注意,允许多个“*”字符(如在 Unix 通配符中,但与 Windows/DOS 通配符相反)。
示例
以下示例假设当前目录是 Erlang/OTP 安装的顶部。
要在所有应用程序中查找所有 .beam
文件,请使用以下行:
filelib:wildcard("lib/*/ebin/*.beam").
要在所有应用程序的 src
目录中查找 .erl
或 .hrl
,请使用以下任一行:
filelib:wildcard("lib/*/src/*.?rl")
filelib:wildcard("lib/*/src/*.{erl,hrl}")
要在 src
或 include
目录中查找所有 .hrl
文件:
filelib:wildcard("lib/*/{src,include}/*.hrl").
查找 src
或 include
目录中所有的 .erl
或 .hrl
文件
filelib:wildcard("lib/*/{src,include}/*.{erl,hrl}")
查找任何子目录中所有的 .erl
或 .hrl
文件
filelib:wildcard("lib/**/*.{erl,hrl}")
-spec wildcard(Wildcard, Cwd) -> [file:filename()] when Wildcard :: filename() | dirname(), Cwd :: dirname().
与 wildcard/1
相同,不同之处在于使用 Cwd
代替工作目录。