File::Spec::Mac - File::Spec for Mac OS (Classic)
require File::Spec::Mac; # Done internally by File::Spec if needed
用於處理檔案規格的方法。
在 Mac OS 中,不需要執行任何操作。傳回給定的內容。
將兩個或多個目錄名稱串接起來,形成一個以冒號 (":") 分隔且以目錄結尾的路徑。預設情況下,產生的路徑是相對路徑,但可以強制設定為絕對路徑 (但請避免這樣做,見下文)。自動在完整路徑的結尾加上一個冒號,因為這是 MacPerl 環境中執行的操作,有助於區分檔案路徑和目錄路徑。
重要注意事項:從此模組的 1.3 版開始,產生的路徑預設為相對路徑,而非絕對路徑。此決定是基於移植性的考量。由於 File::Spec->catdir()
在所有其他作業系統上傳回相對路徑,現在它也會在 Mac OS 上遵循此慣例。請注意,這可能會中斷某些現有的指令碼。
此常式的預期用途是串接目錄名稱。但由於 Macintosh 路徑的性質,允許一些額外的可能性,以使使用此常式在某些常見情況下產生合理的結果。換句話說,您也可以串接路徑,而不是目錄名稱 (嚴格來說,像 ":a" 這樣的字串是一個路徑,但不是一個名稱,因為它包含一個標點符號 ":")。
所以,除了像這樣的呼叫之外
catdir("a") = ":a:"
catdir("a","b") = ":a:b:"
catdir() = "" (special case)
像以下這樣的呼叫
catdir(":a:") = ":a:"
catdir(":a","b") = ":a:b:"
catdir(":a:","b") = ":a:b:"
catdir(":a:",":b:") = ":a:b:"
catdir(":") = ":"
是允許的。
以下是 catdir()
中使用的規則;請注意,我們盡可能與 Unix 相容
結果路徑預設是相對的,也就是說,結果路徑將有一個前導冒號。
會自動將後置冒號新增到結果路徑,以表示目錄。
通常,每個引數會移除一個前導冒號和一個後置冒號(如果有的話)。然後它們會以冒號「:」連接在一起。表示上層目錄路徑的引數(例如「::lib:」)有特殊處理,請參閱 (4),或僅由冒號組成的引數(「冒號路徑」),請參閱 (5)。
當上層目錄路徑(例如「:::lib::」)傳遞為引數時,會正確處理要向上爬升的目錄數量,必要時不會移除前導或後置冒號。例如
catdir(":::a","::b","c") = ":::a::b:c:"
catdir(":::a::","::b","c") = ":::a:::b:c:"
在 任何 位置新增冒號「:」或空字串「」到路徑不會變更路徑,也就是說,這些引數會被忽略。(當「」傳遞為第一個引數時,它有特殊含義,請參閱 (6))。這樣,冒號「:」在 Unix 上會像「.」一樣處理(目前目錄),而空字串「」通常會被忽略(請參閱 File::Spec::Unix 中的「canonpath()」)。同樣地,「::」會像「..」(上層目錄)一樣處理,而「:::」會像「../..」等一樣處理。例如
catdir("a",":",":","b") = ":a:b:"
catdir("a",":","::",":b") = ":a::b:"
如果第一個引數是空字串「」或是一個磁碟區名稱,也就是說,符合模式 /^[^:]+:/,則結果路徑會是絕對的。
將空字串「」傳遞為 catdir()
的第一個引數就像將 File::Spec->rootdir()
傳遞為第一個引數一樣,也就是說
catdir("","a","b") is the same as
catdir(rootdir(),"a","b").
這在 Unix 上是正確的,其中 catdir("","a","b")
會產生「/a/b」,而 rootdir()
是「/」。請注意,Mac OS 上的 rootdir()
是啟動磁碟區,在概念上最接近 Unix 的「/」。這應該有助於執行原本為 Unix 編寫的現有腳本。
對於絕對路徑,會進行一些清理,以確保磁碟區名稱不會緊接在上層目錄之後。這是無效的,因為這會超出「根目錄」。通常,這些情況會像 Unix 對應項一樣處理
Unix:
Unix->catdir("","") = "/"
Unix->catdir("",".") = "/"
Unix->catdir("","..") = "/" # can't go
# beyond root
Unix->catdir("",".","..","..","a") = "/a"
Mac:
Mac->catdir("","") = rootdir() # (e.g. "HD:")
Mac->catdir("",":") = rootdir()
Mac->catdir("","::") = rootdir() # can't go
# beyond root
Mac->catdir("",":","::","::","a") = rootdir() . "a:"
# (e.g. "HD:a:")
然而,這種方法僅限於「根」之後的第一個引數(再次參閱 File::Spec::Unix 中的「canonpath()」)。如果還有更多引數往上移動目錄樹,可能會建立一個超出根目錄的無效路徑。
如您所見,您可以透過傳遞空字串或以磁碟機名稱開頭的路徑作為第一個引數,強制 catdir()
建立絕對路徑。然而,強烈建議您不要這麼做,因為這只為了向後相容性而執行。較新版本的 File::Spec 附帶一個稱為 catpath()
的方法(請參閱下方),旨在提供一個可攜式解決方案來建立絕對路徑。它會採用磁碟機、目錄和檔案部分,並傳回一個完整路徑。雖然 catdir()
仍然適用於串接目錄名稱,但建議您使用 catpath()
來串接磁碟機名稱和目錄路徑。例如:
$dir = File::Spec->catdir("tmp","sources");
$abs_path = File::Spec->catpath("MacintoshHD:", $dir,"");
產生
"MacintoshHD:tmp:sources:" .
串接一個或多個目錄名稱和一個檔案名稱,以形成一個以檔案名稱結尾的完整路徑。產生的路徑預設為相對路徑,但可以強制為絕對路徑(但請避免這麼做)。
重要事項:從此模組的 1.3 版開始,產生的路徑預設為相對路徑,而非絕對路徑。此決定是基於可攜性的考量。由於 File::Spec->catfile()
會在所有其他作業系統上傳回相對路徑,因此現在它也會在 Mac OS 上遵循此慣例。請注意,這可能會中斷一些現有的指令碼。
最後一個引數始終被視為檔案部分。由於 catfile()
使用 catdir()
(請參閱上方)來串接目錄部分(如果有),因此以下關於相對路徑和絕對路徑的內容是正確的
catfile("") = ""
catfile("file") = "file"
但是
catfile("","") = rootdir() # (e.g. "HD:")
catfile("","file") = rootdir() . file # (e.g. "HD:file")
catfile("HD:","file") = "HD:file"
這表示只有在有兩個或更多引數時才會呼叫 catdir()
,正如預期的那樣。
請注意,會從檔案名稱中移除開頭的「:」,因此
catfile("a","b","file") = ":a:b:file" and
catfile("a","b",":file") = ":a:b:file"
會提供相同的答案。
若要串接磁碟機名稱、目錄路徑和檔案名稱,建議您使用 catpath()
(請參閱下方)。
傳回一個代表目前目錄的字串。在 Mac OS 上,這是「:」。
傳回一個代表空裝置的字串。在 Mac OS 上,這是「Dev:Null」。
傳回空字串。Mac OS 沒有真正的根目錄。
如果該目錄存在,則傳回 $ENV{TMPDIR} 的內容,否則傳回目前的作業目錄。在 MacPerl 中,$ENV{TMPDIR} 會包含類似「MacintoshHD:Temporary Items:」的路徑,這是啟動磁碟機上的隱藏目錄。
傳回代表上層目錄的字串。在 Mac OS 中,這是「::」。
以路徑作為引數,如果路徑是絕對路徑,則傳回 true。如果路徑以「:」開頭,則為相對路徑。否則,路徑是絕對路徑,除非路徑不包含任何冒號,也就是說,路徑是「a」等名稱。在這種特殊情況下,路徑被視為相對路徑(也就是說,被視為檔案名稱)。如果您想明確區分,請在路徑的適當位置使用「:」。作為特殊情況,檔案名稱 '' 始終被視為絕對路徑。請注意,在 File::Spec::Mac 的 1.2 版中,這不再會諮詢本機檔案系統。
例如
File::Spec->file_name_is_absolute("a"); # false (relative)
File::Spec->file_name_is_absolute(":a:b:"); # false (relative)
File::Spec->file_name_is_absolute("MacintoshHD:");
# true (absolute)
File::Spec->file_name_is_absolute(""); # true (absolute)
傳回 MacPerl 應用程式的空清單,因為這個概念在 Mac OS 中通常沒有意義。但是,如果您在 MPW 中使用 MacPerl 工具,它會適當地分割 $ENV{Commands},就像在 :lib:ExtUtils:MM_Mac.pm 中所做的那樣。
($volume,$directories,$file) = File::Spec->splitpath( $path );
($volume,$directories,$file) = File::Spec->splitpath( $path,
$no_file );
將路徑分割成磁碟區、目錄和檔案名稱部分。
在 Mac OS 中,假設路徑的最後一部分是檔案名稱,除非 $no_file 為 true 或存在尾隨分隔符號「:」。
磁碟區部分總是會傳回尾隨「:」。目錄部分總是會傳回開頭 (表示相對路徑) 和尾隨「:」(表示目錄)。檔案部分總是會傳回不含開頭「:」。空的部分會傳回空字串 ''。
結果可以傳遞給 catpath()
,以取得等於 (通常與) 原始路徑相同的路徑。
catdir()
的相反。
@dirs = File::Spec->splitdir( $directories );
$directories 應該只有在具有磁碟區概念或路徑語法可以區分檔案和目錄的系統中,才應該是路徑的目錄部分。否則,請考慮使用 splitpath()
。
與僅使用分隔符號來分割目錄不同,可以傳回空目錄名稱 (""
)。由於 Mac OS 上的 catdir()
函數總是會附加一個尾隨的冒號,以區分目錄路徑和檔案路徑,因此會忽略單一尾隨冒號,亦即其後沒有空目錄名稱。
因此,在 Mac OS 上,兩個
File::Spec->splitdir( ":a:b::c:" ); and
File::Spec->splitdir( ":a:b::c" );
都會產生
( "a", "b", "::", "c")
而
File::Spec->splitdir( ":a:b::c::" );
產生
( "a", "b", "::", "c", "::")
$path = File::Spec->catpath($volume,$directory,$file);
取得磁碟區、目錄和檔案部分,並傳回完整路徑。在 Mac OS 上,$volume、$directory 和 $file 會串接在一起。如有需要,會插入一個冒號。您可以為每個部分傳入一個空字串。如果所有部分都為空,則會傳回空字串。如果 $volume 為空,結果將會是相對路徑,以冒號「:」開頭。如果 $volume 和 $directory 為空,則會從 $file 中移除開頭的冒號(如果有的話),並傳回其餘部分。如果 $file 為空,結果路徑將會有尾隨冒號「:」。
取得目標路徑和一個選用的基底路徑,並傳回從基底路徑到目標路徑的相對路徑
$rel_path = File::Spec->abs2rel( $path ) ;
$rel_path = File::Spec->abs2rel( $path, $base ) ;
請注意,假設兩個路徑都使用一種表示法,以區分有尾隨冒號「:」的目錄路徑和沒有尾隨冒號「:」的檔案路徑。
如果 $base 不存在或為空字串,則會使用目前的工作目錄。如果 $base 為相對路徑,則會使用 rel2abs()
函數將其轉換為絕對路徑。這表示會將其視為相對於目前工作目錄的相對路徑。
如果 $path 和 $base 看起來位於兩個不同的磁碟區上,我們不會嘗試解析這兩個路徑,而是會直接傳回 $path。請注意,此模組的先前版本會忽略 $base 的磁碟區,這有時會導致產生錯誤的結果。
如果 $base 沒有尾隨冒號,則會假設 $base 的最後一個元素為檔案名稱。這個檔案名稱會被忽略。否則,會假設所有路徑元件都是目錄。
如果 $path 是相對路徑,它會使用 rel2abs()
轉換成絕對路徑。這表示它會被視為相對於目前工作目錄的相對路徑。
根據 Shigio Yamaguchi 編寫的程式碼。
將相對路徑轉換成絕對路徑
$abs_path = File::Spec->rel2abs( $path ) ;
$abs_path = File::Spec->rel2abs( $path, $base ) ;
請注意,假設兩個路徑都使用一種表示法,以區分有尾隨冒號「:」的目錄路徑和沒有尾隨冒號「:」的檔案路徑。
如果 $base 不存在或為 '',則 $base 會設定為目前工作目錄。如果 $base 是相對路徑,則會使用 rel2abs()
將其轉換成絕對路徑。這表示它會被視為相對於目前工作目錄的相對路徑。
如果 $base 沒有尾隨冒號,則會假設 $base 的最後一個元素為檔案名稱。這個檔案名稱會被忽略。否則,會假設所有路徑元件都是目錄。
如果 $path 已經是絕對路徑,則會傳回它,而忽略 $base。
根據 Shigio Yamaguchi 編寫的程式碼。
請參閱 File::Spec 中的作者清單。Mac OS 支援由 Paul Schinder <schinder@pobox.com> 和 Thomas Wegner <wegner_thomas@yahoo.com> 提供。
版權所有 (c) 2004 Perl 5 Porters。保留所有權利。
此程式為自由軟體;您可以在與 Perl 相同的條款下重新散布或修改它。
請參閱 File::Spec 和 File::Spec::Unix。此套件會覆寫這些方法的實作,而不是語意。