File::Spec - 以可攜式的方式執行檔案名稱操作
use File::Spec;
my $x = File::Spec->catfile('a', 'b', 'c');
在 Unix 下會傳回 'a/b/c'。或
use File::Spec::Functions;
my $x = catfile('a', 'b', 'c');
此模組旨在支援一般在檔案規格 (通常稱為「檔案名稱」,但不要與檔案內容或 Perl 的檔案控制代碼混淆) 上執行的操作,例如將數個目錄和檔案名稱串接成單一路徑,或判斷路徑是否為根目錄。它是根據直接取自 MakeMaker 5.17 的程式碼,而該程式碼是由 Andreas König、Andy Dougherty、Charles Bailey、Ilya Zakharevich、Paul Schinder 等人所撰寫。
由於這些函式在大部分作業系統中並不相同,因此每組特定於作業系統的常式都可以在不同的模組中取得,包括
File::Spec::Unix
File::Spec::Mac
File::Spec::OS2
File::Spec::Win32
File::Spec::VMS
File::Spec 會自動載入適用於目前作業系統的模組。由於某些模組 (例如 VMS) 使用了僅在該作業系統中可用的設施,因此可能無法在所有作業系統中載入所有模組。
由於 File::Spec 是物件導向的,因此不應直接呼叫子常式,例如
File::Spec::catfile('a','b');
而是作為類別方法
File::Spec->catfile('a','b');
對於簡單的用途,File::Spec::Functions 提供了這些方法的方便函式形式。
不對檔案系統進行實體檢查,而是對路徑進行邏輯清理。
$cpath = File::Spec->canonpath( $path ) ;
請注意,這 *不會* 將 x/../y 區段壓縮成 y。這是由設計決定的。如果系統上的 /foo 是指向 /bar/baz 的符號連結,則 /foo/../quux 實際上是 /bar/quux,而不是天真的 ../ 移除會給你的 /quux。如果你想執行這種處理,你可能希望使用 Cwd
的 realpath()
函式來實際遍歷檔案系統,以清理像這樣的路徑。
串接兩個或更多目錄名稱以形成一個以目錄結尾的完整路徑。但從結果字串中移除尾斜線,因為它看起來不好看,沒有必要且會混淆 OS/2。當然,如果這是根目錄,請不要切斷尾斜線 :-)
$path = File::Spec->catdir( @directories );
串接一個或多個目錄名稱和一個檔名以形成一個以檔名結尾的完整路徑
$path = File::Spec->catfile( @directories, $filename );
傳回目前目錄的字串表示形式。
$curdir = File::Spec->curdir();
傳回空裝置的字串表示形式。
$devnull = File::Spec->devnull();
傳回根目錄的字串表示形式。
$rootdir = File::Spec->rootdir();
從可能的暫存目錄清單中傳回第一個可寫目錄的字串表示形式。如果找不到可寫的暫存目錄,則傳回目前目錄。檢查的目錄清單取決於平台;例如 File::Spec::Unix 會檢查 $ENV{TMPDIR}
(除非開啟污染)和 /tmp。
$tmpdir = File::Spec->tmpdir();
傳回父目錄的字串表示形式。
$updir = File::Spec->updir();
給定目錄中的檔案清單(例如來自 readdir()
),移除 '.'
和 '..'
。
安全性注意事項:這不會過濾包含 '..'
的路徑,例如 '../../../../etc/passwd'
,只會過濾與 '.'
和 '..'
完全相符的路徑。
@paths = File::Spec->no_upwards( readdir $dirhandle );
傳回一個 true 或 false 值,分別表示在比較檔案規格時,字母大小寫不重要或很重要。Cygwin 和 Win32 接受一個可選的磁碟機引數。
$is_case_tolerant = File::Spec->case_tolerant();
以路徑作為其引數,如果路徑是絕對路徑,則傳回 true。
$is_absolute = File::Spec->file_name_is_absolute( $path );
這不會諮詢 Unix、Win32、OS/2 或 Mac OS(經典版)上的本機檔案系統。它會諮詢 VMS 的工作環境(請參閱 File::Spec::VMS 中的「file_name_is_absolute」)。
不接受參數。傳回環境變數 PATH
(或本機平台的等效變數)作為清單。
@PATH = File::Spec->path();
加入與 catfile 相同。
將路徑分割成磁碟區、目錄和檔案名稱部分。在沒有磁碟區概念的系統上,會傳回 '' 做為磁碟區。
($volume,$directories,$file) =
File::Spec->splitpath( $path );
($volume,$directories,$file) =
File::Spec->splitpath( $path, $no_file );
對於沒有語法區分檔案名稱和目錄的系統,會假設最後一個檔案是路徑,除非 $no_file
為 true 或存在尾隨分隔符號或 /. 或 /..。在 Unix 上,這表示 $no_file
true 會讓此傳回 ( '', $path, '' )。
目錄部分可能會或可能不會傳回尾隨 '/'
結果可以傳遞給 「catpath()」 以取得等於(通常與相同)原始路徑的路徑。
「catdir」 的相反動作。
@dirs = File::Spec->splitdir( $directories );
$directories
必須只包含具有磁碟區概念或具有區分檔案和目錄的路徑語法的系統的路徑目錄部分。
與僅在分隔符號上分割目錄不同,可以傳回空目錄名稱 (''
),因為這些名稱在某些作業系統上很重要。
接受磁碟區、目錄和檔案部分,並傳回完整路徑。在 Unix 下,$volume
會被忽略,目錄和檔案會串接。必要時會插入 '/'。在其他作業系統上,$volume
很重要。
$full_path = File::Spec->catpath( $volume, $directory, $file );
接受目的地路徑和選用基底路徑,傳回從基底路徑到目的地路徑的相對路徑
$rel_path = File::Spec->abs2rel( $path ) ;
$rel_path = File::Spec->abs2rel( $path, $base ) ;
如果 $base
不存在或為 '',則會使用 Cwd::cwd()。如果 $base
為相對路徑,則會使用 「rel2abs()」 將其轉換為絕對形式。這表示會將其視為相對於 Cwd::cwd()。
在具有磁碟區概念的系統上,如果 $path
和 $base
看起來位於兩個不同的磁碟區,我們不會嘗試解析兩個路徑,而只會傳回 $path
。請注意,此模組的先前版本會忽略 $base
的磁碟區,這會導致垃圾結果。
在具有指示檔案名稱的語法的系統上,這也會忽略 $base
檔案名稱。否則,所有路徑組件都假設為目錄。
如果 $path
是相對路徑,則使用 "rel2abs()" 將其轉換為絕對路徑。這表示它被視為相對於 Cwd::cwd()。
不會對檔案系統進行任何檢查。在 VMS 上,由於會擴充邏輯和巨集,因此會與工作環境互動。
根據 Shigio Yamaguchi 編寫的程式碼。
將相對路徑轉換為絕對路徑。
$abs_path = File::Spec->rel2abs( $path ) ;
$abs_path = File::Spec->rel2abs( $path, $base ) ;
如果 $base
不存在或為 '',則會使用 Cwd::cwd()。如果 $base
為相對路徑,則會使用 「rel2abs()」 將其轉換為絕對形式。這表示會將其視為相對於 Cwd::cwd()。
在具有磁碟區概念的系統上,如果 $path
和 $base
看起來位於兩個不同的磁碟區,我們不會嘗試解析兩個路徑,而只會傳回 $path
。請注意,此模組的先前版本會忽略 $base
的磁碟區,這會導致垃圾結果。
在具有指示檔案名稱的語法的系統上,這也會忽略 $base
檔案名稱。否則,所有路徑組件都假設為目錄。
如果 $path
是絕對路徑,則使用 "canonpath" 清除並傳回。
不會對檔案系統進行任何檢查。在 VMS 上,由於會擴充邏輯和巨集,因此會與工作環境互動。
根據 Shigio Yamaguchi 編寫的程式碼。
如需進一步資訊,請參閱 File::Spec::Unix、File::Spec::Mac、File::Spec::OS2、File::Spec::Win32 或 File::Spec::VMS。
File::Spec::Unix、File::Spec::Mac、File::Spec::OS2、File::Spec::Win32、File::Spec::VMS、File::Spec::Functions、ExtUtils::MakeMaker
由 perl5-porters <perl5-porters@perl.org> 維護。
絕大多數程式碼是由 Kenneth Albanowski <kjahds@kjahds.com>
、Andy Dougherty <doughera@lafayette.edu>
、Andreas König <A.Koenig@franz.ww.TU-Berlin.DE>
、Tim Bunce <Tim.Bunce@ig.co.uk>
編寫。Charles Bailey <bailey@newman.upenn.edu>
提供 VMS 支援。Ilya Zakharevich <ilya@math.ohio-state.edu>
提供 OS/2 支援。Paul Schinder <schinder@pobox.com>
和 Thomas Wegner <wegner_thomas@yahoo.com>
提供 Mac 支援。abs2rel() 和 rel2abs() 由 Shigio Yamaguchi <shigio@tamacom.com>
編寫,由 Barrie Slaymaker <barries@slaysys.com>
修改。splitpath()、splitdir()、catpath() 和 catdir() 由 Barrie Slaymaker 編寫。
版權所有 (c) 2004-2013 Perl 5 Porters。保留所有權利。
此程式為自由軟體;您可以在與 Perl 相同的條款下重新散布或修改它。