File::Spec - portably perform operations on file names
<b> status: Completed </b>
如下是與本篇相關(guān)的文章:
Perl 中的 PathTools 之 Cwd 模塊詳解
Perl 中的 PathTools 之 File::Spec 模塊詳解
Perl 中的 PathTools 之 File::Spec::Functions 模塊詳解
有關(guān)Perl的學(xué)習(xí)、交流與分享晨炕,請(qǐng)關(guān)注專(zhuān)題:碼神之路:Perl篇
簡(jiǎn)介
這個(gè)模塊是按照一定的規(guī)范設(shè)計(jì)的骇笔,使得在不同的操作系統(tǒng)平臺(tái)上可以使用統(tǒng)一規(guī)范的方式在文件上執(zhí)行一般常見(jiàn)的操作躲胳。這里所說(shuō)的文件指的是文件名,而不是文件的內(nèi)容或是perl中文件的句柄颂砸。比如把一些目錄名和一個(gè)文件名連接成一個(gè)路徑,或是判斷一個(gè)路徑是不是根目錄。
因?yàn)檫@些功能對(duì)于大多數(shù)操作系統(tǒng)來(lái)說(shuō)是不同的,所以針對(duì)每個(gè)操作系統(tǒng)特定的例程在一個(gè)單獨(dú)的模塊中:
File::Spec::Unix
File::Spec::Mac
File::Spec::OS2
File::Spec::Win32
File::Spec::VMS
這些模塊會(huì)在自己適合的操作系統(tǒng)中被 File::Spec
模塊自動(dòng)加載辽话。 因?yàn)橐恍┠K(如vm)只能工作在他所適合的特定操作系統(tǒng),所以在所有的操作系統(tǒng)中加載所有模塊。
因?yàn)?File::Spec
模塊是面相對(duì)象的卫病,所以不能直接以子程序的方式調(diào)用油啤,像下面這樣是錯(cuò)誤的:
File::Spec::catfile('a','b');
而是以類(lèi)方法的方式像下面這樣調(diào)用:
File::Spec->catfile('a','b');
在 File::Spec::Functions
模塊中可以簡(jiǎn)單的以函數(shù)的方式使用這個(gè)模塊中的所有類(lèi)方法。
方法
canonpath 方法
$cpath = File::Spec->canonpath( $path ) ;
不在文件系統(tǒng)中做物理文件是否存在的驗(yàn)證蟀苛,僅在邏輯上對(duì)文件路徑進(jìn)行清理益咬。他會(huì)清除掉多余的文件分隔符和 .
,但不會(huì)對(duì) ..
父目錄做處理帜平。如 p/x/../y
不會(huì)被處理成 p/y
幽告;并且符號(hào)鏈接也不會(huì)被處理。如果你想要這些操作可以使用 Cwd
模塊中的 realpath
方法在系統(tǒng)中的物理磁盤(pán)上做檢查從而得到真實(shí)路徑裆甩。
catdir 方法
$path = File::Spec->catdir( @directories );
連接兩個(gè)或兩個(gè)以上的目錄名,形成一個(gè)完整的目錄路徑冗锁。生成的目錄路徑的結(jié)尾處是沒(méi)有文件路徑分隔符的,因?yàn)樵谒邢到y(tǒng)里這都是不必要的嗤栓,并且在 OS/2 系統(tǒng)中這樣做會(huì)出問(wèn)題冻河;當(dāng)然了如果是根目錄箍邮,這個(gè)分隔符是不會(huì)被去除的。
catfile 方法
$path = File::Spec->catfile( @directories, $filename );
連接一個(gè)或多個(gè)目錄與一個(gè)文件名叨叙,形成一個(gè)完整的文件路徑锭弊。
curdir 方法
$curdir = File::Spec->curdir();
返回當(dāng)前目錄的一個(gè)字符串表示。一般是返回 .
摔敛。
devnull 方法
$devnull = File::Spec->devnull();
返回一個(gè) null device 的字符串表示
rootdir 方法
$rootdir = File::Spec->rootdir();
返回一個(gè)根目錄的字符串表示廷蓉,其實(shí)返回的是當(dāng)前系統(tǒng)的“文件路徑分隔符”。
tmpdir 方法
$tmpdir = File::Spec->tmpdir();
返回臨時(shí)目錄列表中第一個(gè)可寫(xiě)目錄的字符串表示马昙。如果沒(méi)有可寫(xiě)的臨時(shí)目錄桃犬,則返回當(dāng)前目錄。臨時(shí)目錄的檢查依賴(lài)于特定的平臺(tái)行楞。
updir 方法
$updir = File::Spec->updir();
返回父目錄的字符串表示攒暇。一般情況下返回的是 ..
no_upwards 方法
@paths = File::Spec->no_upwards( @paths );
給定一個(gè)文件名列表,剔除那些引用父目錄。 (不會(huì)對(duì)符號(hào)鏈接做處理,只有 .
, ..
和與之等價(jià)的其他引用會(huì)被剔除子房。)
如: File::Spec->no_upwards( "a",".","b","..","c","..","d",".","e" )
將得到列表 ("a","b","c","d","e")
case_tolerant 大小寫(xiě)敏感形用?
$is_case_tolerant = File::Spec->case_tolerant();
如果在該操作系統(tǒng)中目錄名是大小寫(xiě)敏感的則返回 false
,否則返回 true
。
file_name_is_absolute 方法
$is_absolute = File::Spec->file_name_is_absolute( $path );
參數(shù)是一個(gè)目錄或文件的路徑证杭,如果是絕對(duì)路徑則返回 true
,否則返回 false
path 方法
@PATH = File::Spec->path();
不需要傳參田度,以列表的方式返回環(huán)境變量中 PATH
的值。
join 方法
內(nèi)部是調(diào)用了 catfile
方法解愤,請(qǐng)參考 catfile
方法镇饺。
splitpath 方法
把一個(gè)路徑分割成“盤(pán)符”,“目錄”送讲,“文件”三部分奸笤,在沒(méi)有“盤(pán)符”概念的系統(tǒng)中,用 ""
空字符串代替盤(pán)符哼鬓。
($volume,$directories,$file) = File::Spec->splitpath( $path );
($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file );
系統(tǒng)無(wú)法分辨參數(shù)給定的路徑中最后一個(gè)路徑名到底是目錄還是文件名监右,所以除非出現(xiàn)以下情況,系統(tǒng)將把最后一個(gè)路徑名默認(rèn)當(dāng)成文件名來(lái)處理:
- 以文件路徑分隔符結(jié)尾
- 以
/.
或/..
結(jié)尾 - 參數(shù)
$no_file
傳的值為true
返回值中$directories
的結(jié)尾可能有 文件路徑分隔符也可能沒(méi)有异希。
返回的結(jié)果可以通過(guò)調(diào)用 catpath()
得到原來(lái)的文件路徑(通常情況下與 參數(shù) $path
相同)
splitdir 方法
本方法是 catdir
的逆操作
@dirs = File::Spec->splitdir( $directories );
在有“盤(pán)符”概念或在語(yǔ)法上區(qū)分目錄和文件的系統(tǒng)中健盒,$directories
必須只能包含完整路徑的目錄部分。
這并不是僅僅的以文件路徑分隔符來(lái)分隔路徑称簿,空目錄名 ""
也必須被返回扣癣,因?yàn)檫@在一個(gè)操作系統(tǒng)中是非常重要的。(根目錄)
catpath 方法
splitpath
的逆操作
$full_path = File::Spec->catpath( $volume, $directory, $file );
傳三個(gè)參數(shù)予跌,分別是“盤(pán)符”,“目錄”善茎,“文件”券册;返回一個(gè)完整的文件路徑。在類(lèi) Unix 系統(tǒng)中“盤(pán)符”可以傳空字符串,因?yàn)槟銦o(wú)論傳什么它都會(huì)被忽略烁焙。但在其他操作系統(tǒng)中這個(gè)是不會(huì)被忽略的航邢,需要傳正確的參數(shù)。
abs2rel 方法
$rel_path = File::Spec->abs2rel( $path ) ;
$rel_path = File::Spec->abs2rel( $path, $base ) ;
如果 $base
是當(dāng)前路徑或 ""
(空目錄),將會(huì)使用 Cwd::cwd
得到一個(gè)絕對(duì)路徑骄蝇。如果 $base
是相對(duì)路徑膳殷,將會(huì)調(diào)用 rel2abs()
得到一個(gè)絕對(duì)路徑;也就是說(shuō)這個(gè)路徑也是相對(duì)于 Cwd::cwd
的九火。
在有“盤(pán)符”概念的系統(tǒng)中赚窃,如果 $base
和 $path
是基于兩上不同的“盤(pán)符”的,我們不會(huì)嘗試去解析岔激,而是直接返回 $path勒极。需要注意的是,在之前的版本中是會(huì)忽略 $base
中的“盤(pán)符”的虑鼎,所以會(huì)返回錯(cuò)誤的結(jié)果辱匿。
擁有文件名語(yǔ)法的系統(tǒng)中,請(qǐng)忽略 $base
中的文件名炫彩,因?yàn)樗械穆窂絻?nèi)容都被當(dāng)成目錄名看待匾七。
如果 $base
是相對(duì)路徑,將會(huì)調(diào)用 rel2abs()
得到一個(gè)絕對(duì)路徑江兢;也就是說(shuō)這個(gè)路徑也是相對(duì)于 Cwd::cwd
的昨忆。
這個(gè)方法不會(huì)去檢查系統(tǒng)中的文件系統(tǒng)來(lái)驗(yàn)證路徑的真實(shí)性。
rel2abs 方法
把一個(gè)相對(duì)路徑轉(zhuǎn)換成一個(gè)絕對(duì)路徑
$abs_path = File::Spec->rel2abs( $path ) ;
$abs_path = File::Spec->rel2abs( $path, $base ) ;
如果 $base
是當(dāng)前路徑或 ""
(空目錄),將會(huì)使用 Cwd::cwd
得到一個(gè)絕對(duì)路徑划址。如果 $base
是相對(duì)路徑扔嵌,將會(huì)調(diào)用 rel2abs()
得到一個(gè)絕對(duì)路徑;也就是說(shuō)這個(gè)路徑也是相對(duì)于 Cwd::cwd
的夺颤。
在有“盤(pán)符”概念的系統(tǒng)中痢缎,如果 $base
和 $path
是基于兩上不同的“盤(pán)符”的,我們不會(huì)嘗試去解析世澜,而是直接返回 $path独旷。需要注意的是,在之前的版本中是會(huì)忽略 $base
中的“盤(pán)符”的寥裂,所以會(huì)返回錯(cuò)誤的結(jié)果嵌洼。
有擁有文件名語(yǔ)法的系統(tǒng)中,請(qǐng)忽略 $base
中的文件名封恰,因?yàn)樗械穆窂絻?nèi)容都被當(dāng)成目錄名看待麻养。
如果 $base
是相對(duì)路徑,將會(huì)調(diào)用 rel2abs()
得到一個(gè)絕對(duì)路徑诺舔;也就是說(shuō)這個(gè)路徑也是相對(duì)于 Cwd::cwd
的鳖昌。
如果 $path
是一個(gè)絕對(duì)路徑备畦,將會(huì)調(diào)用 canonpath
清理后返回。
這個(gè)方法不會(huì)去檢查系統(tǒng)中的文件系統(tǒng)來(lái)驗(yàn)證路徑的真實(shí)性许昨。
相關(guān)文章推薦
如下是與本篇相關(guān)的文章:
Perl 中的 PathTools 之 Cwd 模塊詳解
Perl 中的 PathTools 之 File::Spec 模塊詳解
Perl 中的 PathTools 之 File::Spec::Functions 模塊詳解
有關(guān)Perl的學(xué)習(xí)懂盐、交流與分享,請(qǐng)關(guān)注專(zhuān)題:碼神之路:Perl篇