Perl 中的 PathTools 之 File::Spec 模塊詳解

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)處理:

  1. 以文件路徑分隔符結(jié)尾
  2. /./.. 結(jié)尾
  3. 參數(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篇

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末糕档,一起剝皮案震驚了整個(gè)濱河市莉恼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌速那,老刑警劉巖俐银,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異琅坡,居然都是意外死亡悉患,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)榆俺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)售躁,“玉大人,你說(shuō)我怎么就攤上這事茴晋∨憬荩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵诺擅,是天一觀(guān)的道長(zhǎng)市袖。 經(jīng)常有香客問(wèn)我,道長(zhǎng)烁涌,這世上最難降的妖魔是什么苍碟? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮撮执,結(jié)果婚禮上微峰,老公的妹妹穿的比我還像新娘。我一直安慰自己抒钱,他們只是感情好蜓肆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著谋币,像睡著了一般仗扬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蕾额,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天早芭,我揣著相機(jī)與錄音,去河邊找鬼诅蝶。 笑死退个,一個(gè)胖子當(dāng)著我的面吹牛精肃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帜乞,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼筐眷!你這毒婦竟也來(lái)了黎烈?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤匀谣,失蹤者是張志新(化名)和其女友劉穎照棋,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體武翎,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烈炭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宝恶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片符隙。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖垫毙,靈堂內(nèi)的尸體忽然破棺而出霹疫,到底是詐尸還是另有隱情,我是刑警寧澤综芥,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布丽蝎,位于F島的核電站,受9級(jí)特大地震影響膀藐,放射性物質(zhì)發(fā)生泄漏屠阻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一额各、第九天 我趴在偏房一處隱蔽的房頂上張望国觉。 院中可真熱鬧,春花似錦臊泰、人聲如沸蛉加。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)针饥。三九已至,卻和暖如春需频,著一層夾襖步出監(jiān)牢的瞬間丁眼,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工昭殉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留苞七,地道東北人藐守。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蹂风,于是被迫代替她去往敵國(guó)和親卢厂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容