查看源代码 filelib (stdlib v6.2)

文件工具,例如文件名的通配符匹配。

此模块包含比 file 模块更高级的实用工具。

此模块不支持“原始”文件名(即,名称不符合预期编码的文件)。此模块中的函数会忽略此类文件。

有关原始文件名的更多信息,请参见 file 模块。

注意

此模块中的功能通常假设输入有效,并且不一定会在使用无效编码的输入上失败,但很可能会产生无效的输出。

文件操作过去接受包含空字符(整数值零)的文件名。这会导致名称被截断,并且在某些情况下会混淆原始操作的参数。现在拒绝在文件名内部包含空字符的文件名,并会导致原始文件操作失败。

警告

目前,原始文件操作将接受文件名末尾的空字符。但是,此类文件名仍然被记录为无效。该实现将来也会更改并拒绝此类文件名。

摘要

函数

确保指定文件或目录名称 Name 的所有父目录都存在,并在必要时尝试创建它们。

确保指定路径 Path 的所有父目录都存在,并在必要时尝试创建它们。

返回指定文件的大小。

通过将后缀规则应用于给定的目录路径来查找具有给定名称的文件。

等效于 find_source(Base, Dir),其中 Dirfilename:dirname(FilePath)Basefilename: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 代替工作目录。

类型

链接到此类型

dirname()

查看源代码 (未导出)
-type dirname() :: filename().
链接到此类型

dirname_all()

查看源代码 (未导出)
-type dirname_all() :: filename_all().
链接到此类型

filename()

查看源代码 (未导出)
-type filename() :: file:name().
链接到此类型

filename_all()

查看源代码 (未导出)
-type filename_all() :: file:name_all().
链接到此类型

find_file_rule()

查看源代码 (未导出)
-type find_file_rule() :: {ObjDirSuffix :: string(), SrcDirSuffix :: string()}.
链接到此类型

find_source_rule()

查看源代码 (未导出)
-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}

链接到此函数

ensure_path(Path)

查看源代码 (自 OTP 25.0 起)
-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().

返回指定文件的大小。

链接到此函数

find_file(Filename, Dir)

查看源代码 (自 OTP 20.0 起)
-spec find_file(Filename :: filename(), Dir :: filename()) -> {ok, filename()} | {error, not_found}.

等效于 find_file(Filename, Dir, [])

链接到此函数

find_file/3

查看源代码 (自 OTP 20.0 起)
-spec find_file(filename(), filename(), [find_file_rule()]) -> {ok, filename()} | {error, not_found}.

通过将后缀规则应用于给定的目录路径来查找具有给定名称的文件。

例如,规则 {"ebin", "src"} 表示如果目录路径以 "ebin" 结尾,则应搜索以 "src" 结尾的相应路径。

如果省略 Rules 或为空列表,则使用默认的系统规则。另请参见 Kernel 应用程序参数 source_search_rules

链接到此函数

find_source(FilePath)

查看源代码 (自 OTP 20.0 起)
-spec find_source(filename()) -> {ok, filename()} | {error, not_found}.

等效于 find_source(Base, Dir),其中 Dirfilename:dirname(FilePath)Basefilename:basename(FilePath)

链接到此函数

find_source(Filename, Dir)

查看源代码 (自 OTP 20.0 起)
-spec find_source(filename(), filename()) -> {ok, filename()} | {error, not_found}.

等效于 find_source(Filename, Dir, [])

链接到此函数

find_source/3

查看源代码 (自 OTP 20.0 起)
-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

链接到此函数

fold_files(Dir, RegExp, Recursive, Fun, AccIn)

查看源代码
-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 模块)。

如果 Recursivetrue,则会处理 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

链接到此函数

safe_relative_path(Filename, Cwd)

查看源代码 (自 OTP 23.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}")

要在 srcinclude 目录中查找所有 .hrl 文件:

filelib:wildcard("lib/*/{src,include}/*.hrl").

查找 srcinclude 目录中所有的 .erl.hrl 文件

filelib:wildcard("lib/*/{src,include}/*.{erl,hrl}")

查找任何子目录中所有的 .erl.hrl 文件

filelib:wildcard("lib/**/*.{erl,hrl}")
链接到此函数

wildcard(Wildcard, Cwd)

查看源代码
-spec wildcard(Wildcard, Cwd) -> [file:filename()]
                  when Wildcard :: filename() | dirname(), Cwd :: dirname().

wildcard/1 相同,不同之处在于使用 Cwd 代替工作目录。