查看源码 filename (stdlib v6.2)
文件名操作函数。
此模块提供用于分析和操作文件名的函数。这些函数的设计使得 Erlang 代码可以在具有不同文件名格式的多种不同平台上工作。文件名是指所有可以用来表示文件的字符串。文件名可以是短的相对名称,如 foo.erl
,长的绝对名称,包括驱动器指示符,目录名称,如 D:\usr/local\bin\erl/lib\tools\foo.erl
,或介于两者之间的任何变体。
在 Windows 中,所有函数都只返回带有正斜杠的文件名,即使参数包含反斜杠也是如此。要通过删除多余的目录分隔符来规范化文件名,请使用 join/1
。
该模块支持 原始文件名,方式是如果存在二进制文件,或者无法根据 file:native_name_encoding/0
的返回值解释文件名,则也会返回原始文件名。例如,如果为 join/1
提供一个二进制路径组件(且无法在当前本机文件名编码下解释),则会返回一个原始文件名(当然会执行连接操作)。有关原始文件名的更多信息,请参阅 file
模块。
注意
此模块中的功能通常假设输入有效,并且不一定会因为不使用有效编码的输入而失败,但很可能会产生无效的输出。
文件操作过去接受包含空字符(整数值零)的文件名。这会导致名称被截断,在某些情况下,原始操作的参数会混淆。现在拒绝文件名内部包含空字符的文件名,这将导致原始文件操作失败。
警告
目前,原始文件操作会接受文件名末尾的空字符。但是,此类文件名仍然被记录为无效。未来实现也会发生变化,并拒绝此类文件名。
摘要
函数
转换相对的 Filename
并返回一个绝对名称。不会尝试创建最短的绝对名称,因为这会在允许链接的文件系统上给出不正确的结果。
与 absname/1
相同,不同之处在于,文件名要相对于的目录在参数 Dir
中指定。
将绝对目录与相对文件名连接起来。
返回 Filename
的最后一个组件,如果它不包含任何目录分隔符,则返回 Filename
本身。
返回剥离了扩展名 Ext
的 Filename
的最后一个组件。
返回 Filename
的目录部分。
返回 Filename
的文件扩展名,包括句点。如果不存在扩展名,则返回空字符串。
将可能由字符和原子组成的深层列表文件名转换为相应的扁平字符串文件名。
使用目录分隔符连接文件名 Components
的列表。如果 Components
的某个元素包含绝对路径,例如 "/xxx"
,则会从结果中删除任何前面的元素。
使用目录分隔符连接两个文件名组件。等同于 join([Name1, Name2])
。
将 Path
转换为当前平台上命令 shell 和本机应用程序接受的形式。在 Windows 上,正斜杠将转换为反斜杠。在所有平台上,名称都由 join/1
完成规范化。
返回路径类型,它是以下之一
删除文件名扩展名。
从 Filename
中删除文件名扩展名 Ext
。
返回一个列表,其元素是 Filename
的路径组件。
类型
-type basedir_path_type() :: user_cache | user_config | user_data | user_log.
-type basedir_paths_type() :: site_config | site_data.
函数
-spec absname(Filename) -> file:filename_all() when Filename :: file:name_all().
转换相对的 Filename
并返回一个绝对名称。不会尝试创建最短的绝对名称,因为这会在允许链接的文件系统上给出不正确的结果。
Unix 示例
1> pwd().
"/usr/local"
2> filename:absname("foo").
"/usr/local/foo"
3> filename:absname("../x").
"/usr/local/../x"
4> filename:absname("/").
"/"
Windows 示例
1> pwd().
"D:/usr/local"
2> filename:absname("foo").
"D:/usr/local/foo"
3> filename:absname("../x").
"D:/usr/local/../x"
4> filename:absname("/").
"D:/"
-spec absname(Filename, Dir) -> file:filename_all() when Filename :: file:name_all(), Dir :: file:name_all().
与 absname/1
相同,不同之处在于,文件名要相对于的目录在参数 Dir
中指定。
-spec absname_join(Dir, Filename) -> file:filename_all() when Dir :: file:name_all(), Filename :: file:name_all().
将绝对目录与相对文件名连接起来。
类似于 join/2
,但在对原始文件名长度有严格限制且不支持符号链接的平台上,Filename
中前导的父目录组件会与 Dir
中结尾的目录组件进行匹配,以便可以从结果中删除它们,从而最大限度地缩短其长度。
-spec basedir(PathType, Application) -> file:filename_all() when PathType :: basedir_path_type(), Application :: string() | binary(); (PathsType, Application) -> [file:filename_all()] when PathsType :: basedir_paths_type(), Application :: string() | binary().
等同于 basedir(PathType, Application, #{}) 或 basedir(PathsType, Application, #{})。
-spec basedir(PathType, Application, Opts) -> file:filename_all() when PathType :: basedir_path_type(), Application :: string() | binary(), Opts :: basedir_opts(); (PathsType, Application, Opts) -> [file:filename_all()] when PathsType :: basedir_paths_type(), Application :: string() | binary(), Opts :: basedir_opts().
返回给定类型的合适的路径或路径列表。如果 Opts
中未设置 os
,该函数将默认为本机选项,即 os:type/0
所理解的 'linux'
、'darwin'
或 'windows'
。任何未被识别为 'darwin'
或 'windows'
的内容都会被解释为 'linux'
。
选项 'author'
和 'version'
仅与 'windows'
选项模式一起使用。
user_cache
路径位置旨在用于本地计算机上的临时数据文件。
在 Linux 上:遵循操作系统环境变量
XDG_CACHE_HOME
。1> filename:basedir(user_cache, "my_application", #{os=>linux}). "/home/otptest/.cache/my_application"
在 Darwin 上
1> filename:basedir(user_cache, "my_application", #{os=>darwin}). "/home/otptest/Library/Caches/my_application"
在 Windows 上
1> filename:basedir(user_cache, "My App"). "c:/Users/otptest/AppData/Local/My App/Cache" 2> filename:basedir(user_cache, "My App"). "c:/Users/otptest/AppData/Local/My App/Cache" 3> filename:basedir(user_cache, "My App", #{author=>"Erlang"}). "c:/Users/otptest/AppData/Local/Erlang/My App/Cache" 4> filename:basedir(user_cache, "My App", #{version=>"1.2"}). "c:/Users/otptest/AppData/Local/My App/1.2/Cache" 5> filename:basedir(user_cache, "My App", #{author=>"Erlang",version=>"1.2"}). "c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Cache"
user_config
路径位置旨在用于持久配置文件。
在 Linux 上:遵循操作系统环境变量
XDG_CONFIG_HOME
。2> filename:basedir(user_config, "my_application", #{os=>linux}). "/home/otptest/.config/my_application"
在 Darwin 上
2> filename:basedir(user_config, "my_application", #{os=>darwin}). "/home/otptest/Library/Application Support/my_application"
在 Windows 上
1> filename:basedir(user_config, "My App"). "c:/Users/otptest/AppData/Roaming/My App" 2> filename:basedir(user_config, "My App", #{author=>"Erlang", version=>"1.2"}). "c:/Users/otptest/AppData/Roaming/Erlang/My App/1.2"
user_data
路径位置旨在用于持久数据文件。
在 Linux 上:遵循操作系统环境变量
XDG_DATA_HOME
。3> filename:basedir(user_data, "my_application", #{os=>linux}). "/home/otptest/.local/my_application"
在 Darwin 上
3> filename:basedir(user_data, "my_application", #{os=>darwin}). "/home/otptest/Library/Application Support/my_application"
在 Windows 上
8> filename:basedir(user_data, "My App"). "c:/Users/otptest/AppData/Local/My App" 9> filename:basedir(user_data, "My App",#{author=>"Erlang",version=>"1.2"}). "c:/Users/otptest/AppData/Local/Erlang/My App/1.2"
user_log
路径位置旨在用于本地计算机上的临时日志文件。
在 Linux 上:遵循操作系统环境变量
XDG_CACHE_HOME
。4> filename:basedir(user_log, "my_application", #{os=>linux}). "/home/otptest/.cache/my_application/log"
在 Darwin 上
4> filename:basedir(user_log, "my_application", #{os=>darwin}). "/home/otptest/Library/Logs/my_application"
在 Windows 上
12> filename:basedir(user_log, "My App"). "c:/Users/otptest/AppData/Local/My App/Logs" 13> filename:basedir(user_log, "My App",#{author=>"Erlang",version=>"1.2"}). "c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Logs"
site_config
在 Linux 上:遵循操作系统环境变量
XDG_CONFIG_DIRS
。5> filename:basedir(site_config, "my_application", #{os=>linux}). ["/usr/local/share/my_application", "/usr/share/my_application"] 6> os:getenv("XDG_CONFIG_DIRS"). "/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg" 7> filename:basedir(site_config, "my_application", #{os=>linux}). ["/etc/xdg/xdg-ubuntu/my_application", "/usr/share/upstart/xdg/my_application", "/etc/xdg/my_application"] 8> os:unsetenv("XDG_CONFIG_DIRS"). true 9> filename:basedir(site_config, "my_application", #{os=>linux}). ["/etc/xdg/my_application"]
在 Darwin 上
5> filename:basedir(site_config, "my_application", #{os=>darwin}). ["/Library/Application Support/my_application"]
site_data
在 Linux 上:遵循操作系统环境变量
XDG_DATA_DIRS
。10> os:getenv("XDG_DATA_DIRS"). "/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/" 11> filename:basedir(site_data, "my_application", #{os=>linux}). ["/usr/share/ubuntu/my_application", "/usr/share/gnome/my_application", "/usr/local/share/my_application", "/usr/share/my_application"] 12> os:unsetenv("XDG_DATA_DIRS"). true 13> filename:basedir(site_data, "my_application", #{os=>linux}). ["/usr/local/share/my_application", "/usr/share/my_application"]
在 Darwin 上
5> filename:basedir(site_data, "my_application", #{os=>darwin}). ["/Library/Application Support/my_application"]
-spec basename(Filename) -> file:filename_all() when Filename :: file:name_all().
返回 Filename
的最后一个组件,如果它不包含任何目录分隔符,则返回 Filename
本身。
示例
5> filename:basename("foo").
"foo"
6> filename:basename("/usr/foo").
"foo"
7> filename:basename("/").
[]
-spec basename(Filename, Ext) -> file:filename_all() when Filename :: file:name_all(), Ext :: file:name_all().
返回剥离了扩展名 Ext
的 Filename
的最后一个组件。
此函数用于删除(可能)特定的扩展名。要在不确定扩展名的情况下删除现有扩展名,请使用 rootname(basename(Filename))
。
示例
8> filename:basename("~/src/kalle.erl", ".erl").
"kalle"
9> filename:basename("~/src/kalle.beam", ".erl").
"kalle.beam"
10> filename:basename("~/src/kalle.old.erl", ".erl").
"kalle.old"
11> filename:rootname(filename:basename("~/src/kalle.erl")).
"kalle"
12> filename:rootname(filename:basename("~/src/kalle.beam")).
"kalle"
-spec dirname(Filename) -> file:filename_all() when Filename :: file:name_all().
返回 Filename
的目录部分。
示例
13> filename:dirname("/usr/src/kalle.erl").
"/usr/src"
14> filename:dirname("kalle.erl").
"."
5> filename:dirname("\\usr\\src/kalle.erl"). % Windows
"/usr/src"
-spec extension(Filename) -> file:filename_all() when Filename :: file:name_all().
返回 Filename
的文件扩展名,包括句点。如果不存在扩展名,则返回空字符串。
示例
15> filename:extension("foo.erl").
".erl"
16> filename:extension("beam.src/kalle").
[]
-spec flatten(Filename) -> file:filename_all() when Filename :: file:name_all().
将可能由字符和原子组成的深层列表文件名转换为相应的扁平字符串文件名。
-spec join(Components) -> file:filename_all() when Components :: [file:name_all()].
使用目录分隔符连接文件名 Components
的列表。如果 Components
的某个元素包含绝对路径,例如 "/xxx"
,则会从结果中删除任何前面的元素。
结果已“规范化”
- 删除多余的目录分隔符。
- 在 Windows 中,所有目录分隔符都是正斜杠,并且驱动器号都是小写。
示例
17> filename:join(["/usr", "local", "bin"]).
"/usr/local/bin"
18> filename:join(["a/b///c/"]).
"a/b/c"
6> filename:join(["B:a\\b///c/"]). % Windows
"b:a/b/c"
-spec join(Name1, Name2) -> file:filename_all() when Name1 :: file:name_all(), Name2 :: file:name_all().
使用目录分隔符连接两个文件名组件。等同于 join([Name1, Name2])
。
-spec nativename(Path) -> file:filename_all() when Path :: file:name_all().
将 Path
转换为当前平台上命令 shell 和本机应用程序接受的形式。在 Windows 上,正斜杠将转换为反斜杠。在所有平台上,名称都由 join/1
完成规范化。
示例
19> filename:nativename("/usr/local/bin/"). % Unix
"/usr/local/bin"
7> filename:nativename("/usr/local/bin/"). % Windows
"\\usr\\local\\bin"
-spec pathtype(Path) -> absolute | relative | volumerelative when Path :: file:name_all().
返回路径类型,它是以下之一
absolute
- 路径名是指特定卷上的特定文件。Unix 示例:
/usr/local/bin
Windows 示例:
D:/usr/local/bin
relative
- 路径名相对于当前卷上的当前工作目录。示例:
foo/bar, ../src
volumerelative
- 路径名相对于指定卷上的当前工作目录,或者它是当前工作卷上的特定文件。Windows 示例:
D:bar.erl, /bar/foo.erl
-spec rootname(Filename) -> file:filename_all() when Filename :: file:name_all().
删除文件名扩展名。
示例
1> filename:rootname("/beam.src/kalle").
"/beam.src/kalle"
2> filename:rootname("/beam.src/foo.erl").
"/beam.src/foo"
-spec rootname(Filename, Ext) -> file:filename_all() when Filename :: file:name_all(), Ext :: file:name_all().
从 Filename
中删除文件名扩展名 Ext
。
示例
1> filename:rootname("/beam.src/foo.erl", ".erl").
"/beam.src/foo"
2> filename:rootname("/beam.src/foo.beam", ".erl").
"/beam.src/foo.beam"
-spec split(Filename) -> Components when Filename :: file:name_all(), Components :: [file:name_all()].
返回一个列表,其元素是 Filename
的路径组件。
示例
24> filename:split("/usr/local/bin").
["/","usr","local","bin"]
25> filename:split("foo/bar").
["foo","bar"]
26> filename:split("a:\\msdev\\include").
["a:/","msdev","include"]