filename
文件名
模块
文件名
模块摘要
文件名操作函数。
描述
本模块提供分析和操作文件名的功能。这些函数的设计使得Erlang代码能够在许多不同的平台上工作,具有不同的文件名格式。使用文件名意味着所有可用于表示文件的字符串。文件名可以是一个简短的相对名称,如foo.erl
,一个长的绝对名称,包括一个驱动器指示符,一个目录名,如D:\usr/local\bin\erl/lib\tools\foo.erl
,或两者之间的任何变化。
在Windows中,所有函数都只返回带有正斜杠的文件名,即使参数包含反斜杠。若要通过删除冗余目录分隔符使文件名正常化,请使用join/1
...
该模块支持原始文件名,方式是如果存在二进制文件,或者文件名不能根据返回值解释,则返回file:native_name_encoding/0
原始文件名。例如,join/1
提供了一个二进制路径组件(并且不能在当前本地文件名编码下进行解释)会生成返回的原始文件名(当然会执行连接操作)。有关原始文件名的更多信息,请参阅file
模块。
数据类型
basedir_type() =
user_cache |
user_config |
user_data |
user_log |
site_config |
site_data
输出
absname(Filename) -> file:filename_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:/"
absname(Filename, Dir) -> file:filename_all()
类型
absname/1
与之相同,只是在参数中指定了文件名相对的目录Dir
。
absname_join(Dir, Filename) -> file:filename_all()
类型
使用相对文件名连接绝对目录。与join/2
原始文件名长度受到严格限制并且不支持符号链接的平台类似(但是,对于符号链接不支持),前导父目录组件Filename
与后面的目录组件匹配,Dir
以便将它们从结果中删除 - 最小化其长度。
basedir(Type, Application) -> file:filename_all()
类型
相当于basedir(Type,Application, #{})
...
basedir(Type, Application, Opts) -> file:filename_all()
类型
为给定类型返回合适的路径或路径。如果os
在未设置Opts
的功能将默认为本地选择,那就是'linux'
,'darwin'
或'windows'
由所理解os:type/0
。任何未被识别为'darwin'
或被'windows'
解释为'linux'
。
选择'author'
和'version'
只与'windows'
选择模式。
user_config
路径位置用于持久配置文件。
在Linux上:尊重os环境变量XDG_CONFIG_HOME
。
2> filename:basedir(user_config, "my_application", #{os=>linux}). "/home/otptest/.config/my_application"
On Darwin:2> filename:basedir(user_config, "my_application", #{os=>darwin}). "/home/otptest/Library/Application Support/my_application"
On 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上:尊重os环境变量XDG_DATA_HOME。3> filename:basedir(user_data,“my_application”,#{os => linux})。“/home/otptest/.local/my_application”在达尔文:3>文件名:basedir(user_data,“my_application”,#{os =>达尔文})。“/ 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上:尊重os环境变量XDG_CACHE_HOME
...
4> filename:basedir(user_log,“my_application”,#{os => linux})。“/home/otptest/.cache/my_application/log”
On Darwin:4> filename:basedir(user_log, "my_application", #{os=>darwin}). "/home/otptest/Library/Caches/my_application"
On 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上:尊重os环境变量XDG_CONFIG_DIRS。5> filename:basedir(site_data,“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})。“
site_data
在linux上:尊重os环境变量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"
在达尔文:5>文件名:basedir(site_data,“my_application”,#{os =>达尔文})。“/ Library / Application Support / my_application”
basename(Filename) -> file:filename_all()
类型
如果文件名不包含任何目录分隔符,则返回文件名的最后一个组件或文件名本身。
例子:
5> filename:basename("foo").
"foo"
6> filename:basename("/usr/foo").
"foo"
7> filename:basename("/").
[]
basename(Filename, Ext) -> file:filename_all()
类型
返回剥离了扩展Ext的文件名的最后一个组件。 此功能用于删除(可能的)特定扩展名。 要删除现有的扩展名(如果您不确定它是哪一个扩展名),请使用rootname(basename(文件名))。
例子:
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"
dirname(Filename) -> file:filename_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"
extension(Filename) -> file:filename_all()
类型
返回Filename
包括句号的文件扩展名。如果不存在扩展名,则返回空字符串。
例子:
15> filename:extension("foo.erl").
".erl"
16> filename:extension("beam.src/kalle").
[]
find_src(Beam) ->
{SourceFile,Options}{ErrorReason,Module}{ErrorReason}
find_src(Beam, Rules) ->
{SourceFile,Options}{ErrorReason,Module}{ErrorReason}
类型
查找模块的源文件名和编译器选项。结果可以给compile:file/2
若要再次编译该文件,请执行以下操作。
警告
这一功能已被废弃。使用filelib:find_source/1
而是用来查找源文件。
如果可能,请使用beam_lib(3)
模块从BEAM文件中提取编译器选项和抽象代码格式,然后进行编译。
论辩Beam
,它可以是字符串或原子,可以指定模块名称或源代码的路径(有扩展名也可以不扩展名)。".erl"
在任何一种情况下,模块都必须由代码服务器知道,也就是说,code:which(Module)
一定要成功。
规则描述了在知道目标代码目录时如何找到源目录。 它是一个元组{BinSuffix,SourceSuffix}的列表,并且被解释如下:如果对象所在的目录名称的末尾与BinSuffix匹配,那么源代码目录具有相同的名称,但BinSuffix替换为SourceSuffix。 规则默认为:
[{"", ""}, {"ebin", "src"}, {"ebin", "esrc"}]
如果在生成的目录中找到源文件,则该函数会将该位置与选项一起返回。 否则,尝试下一个规则,依此类推。
如果成功,该函数返回{SourceFile,Options}。 SourceFile是没有扩展名“.erl”的源文件的绝对路径。 选项包括使用compile:file / 2重新编译文件所需的选项,但不包括报告和详细信息等选项,这些选项不会更改生成代码的方式。 选项{outdir,Path}和{i,Path}中的路径保证是绝对路径。
flatten(Filename) -> file:filename_all()
类型
将可能由字符和原子组成的深列表文件名转换为相应的平面字符串文件名。
join(Components) -> file:filename_all()
类型
使用目录分隔符连接文件名组件的列表。 如果组件的其中一个元素包含绝对路径,例如“/ 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"
join(Name1, Name2) -> file:filename_all()
类型
用目录分隔符连接两个文件名组件。相当于join([Name1, Name2])
...
nativename(Path) -> file:filename_all()
类型
转换Path
为当前平台上的命令外壳程序和本机应用程序接受的形式。在Windows上,正斜杠转换为反斜杠。在所有平台上,名称都按照所做的标准化join/1
。
例子:
19> filename:nativename("/usr/local/bin/"). % Unix
"/usr/local/bin"
7> filename:nativename("/usr/local/bin/"). % Windows
"\\usr\\local\\bin"
pathtype(Path) -> absolute | relative | volumerelative
类型
返回路径类型,它是以下内容之一:
absolute
路径名是指特定卷上的特定文件。
Unix示例:/usr/local/bin
Windows示例:D:/usr/local/bin
relative
路径名相对于当前卷上的当前工作目录。
例子:foo/bar, ../src
volumerelative
路径名称相对于指定卷上的当前工作目录,或者是当前工作卷上的特定文件。
Windows示例:D:bar.erl, /bar/foo.erl
rootname(Filename) -> file:filename_all()
rootname(Filename, Ext) -> file:filename_all()
类型
移除文件扩展名。rootname/2
作为rootname/1
,但只有当扩展名为Ext
...
例子:
20> filename:rootname("/beam.src/kalle").
/beam.src/kalle"
21> filename:rootname("/beam.src/foo.erl").
"/beam.src/foo"
22> filename:rootname("/beam.src/foo.erl", ".erl").
"/beam.src/foo"
23> filename:rootname("/beam.src/foo.beam", ".erl").
"/beam.src/foo.beam"
safe_relative_path(Filename) -> unsafe | SafeFilename
类型
通过消除“..”和“。”来消除相对路径。组件来防止目录遍历攻击。要么返回清理过的路径名称,要么返回原子,unsafe
如果路径不安全。在下列情况下,路径被认为是不安全的:
- 路径不是相对的。
- “..”组件将爬上相对路径的根部。
例子:
1> filename:safe_relative_path("dir/sub_dir/..").
"dir"
2> filename:safe_relative_path("dir/..").
[]
3> filename:safe_relative_path("dir/../..").
unsafe
4> filename:safe_relative_path("/abs/path").
unsafe
split(Filename) -> Components
类型
返回一个列表,其元素是路径组件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"]