檢視原始碼 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
不包含任何目錄分隔符,則傳回 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 上:遵守 os 環境變數
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 上:遵守 os 環境變數
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 上:遵守 os 環境變數
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 上:遵守 os 環境變數
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 上:遵守 os 環境變數
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 上:遵守 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"]
在 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
不包含任何目錄分隔符,則傳回 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"]