成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Node.js 指南(使用不同的文件系統(tǒng))

RebeccaZhong / 1494人閱讀

摘要:避免使用最低公分母方法你可能想讓你的程序像最低公分母文件系統(tǒng)一樣,通過將所有文件名規(guī)范化為大寫,將所有文件名規(guī)范化為格式,并將所有文件時(shí)間戳標(biāo)準(zhǔn)化為秒分辨率,這是最小公分母的方法。

使用不同的文件系統(tǒng)

Node公開了文件系統(tǒng)的許多功能,但并非所有文件系統(tǒng)都相似,以下是建議的最佳實(shí)踐,以便在使用不同的文件系統(tǒng)時(shí)保持代碼簡單和安全。

文件系統(tǒng)行為

在使用文件系統(tǒng)之前,你需要知道它的行為方式,不同的文件系統(tǒng)表現(xiàn)不同,并且具有比其他或多或少的功能:區(qū)分大小寫、不區(qū)分大小寫、大小寫保留、Unicode形式保留、時(shí)間戳解析、擴(kuò)展屬性、inode、Unix權(quán)限、備用數(shù)據(jù)流等。

警惕從process.platform推斷文件系統(tǒng)行為,例如,不要假設(shè)因?yàn)槟愕某绦蛟贒arwin上運(yùn)行,因此你正在處理不區(qū)分大小寫的文件系統(tǒng)(HFS+),因?yàn)橛脩艨赡苷谑褂脜^(qū)分大小寫的文件系統(tǒng)(HFSX)。類似地,不要假設(shè)因?yàn)槟愕某绦蛟贚inux上運(yùn)行,因此你正在處理支持Unix權(quán)限和inode的文件系統(tǒng),因?yàn)槟憧赡芪挥谔囟ǖ耐獠框?qū)動器、USB或網(wǎng)絡(luò)驅(qū)動器上。

操作系統(tǒng)可能不容易推斷文件系統(tǒng)行為,但并不會丟失所有內(nèi)容,你可以探測文件系統(tǒng)以查看它的實(shí)際行為,而不是保留每個已知文件系統(tǒng)和行為的列表(總是不完整),某些易于探測的特征的存在或缺失,往往足以推斷其他更難探測的特征的行為。

請記住,某些用戶可能在工作樹中的各種路徑上安裝了不同的文件系統(tǒng)。

避免使用最低公分母方法

你可能想讓你的程序像最低公分母文件系統(tǒng)一樣,通過將所有文件名規(guī)范化為大寫,將所有文件名規(guī)范化為NFC Unicode格式,并將所有文件時(shí)間戳標(biāo)準(zhǔn)化為1秒分辨率,這是最小公分母的方法。

不要這樣做,你只能安全地與文件系統(tǒng)進(jìn)行交互,該文件系統(tǒng)在各個方面具有完全相同的最小公分母特征,你將無法以用戶期望的方式使用更高級的文件系統(tǒng),并且你將遇到文件名或時(shí)間戳沖突,你肯定會通過一系列復(fù)雜的相關(guān)事件來丟失和損壞用戶數(shù)據(jù),并且你將創(chuàng)建即使不是不可能解決也很困難的bug。

當(dāng)你以后需要支持僅具有2秒或24小時(shí)時(shí)間戳分辨率的文件系統(tǒng)時(shí)會發(fā)生什么?當(dāng)Unicode標(biāo)準(zhǔn)進(jìn)展到包括稍微不同的規(guī)范化算法時(shí)(如過去發(fā)生的那樣)會發(fā)生什么?

最小公分母方法傾向于嘗試僅使用“可移植”系統(tǒng)調(diào)用來創(chuàng)建可移植程序,這會導(dǎo)致程序出現(xiàn)漏洞,而且實(shí)際上是不可移植的。

采用超集方法

通過采用超集方法充分利用你支持的每個平臺,例如,一個可移植備份程序應(yīng)該在Windows系統(tǒng)之間正確地同步btimes(文件或文件夾的創(chuàng)建時(shí)間),并且不應(yīng)該銷毀或更改btimes,即使Linux系統(tǒng)不支持btimes。相同的可移植備份程序應(yīng)該在Linux系統(tǒng)之間正確同步Unix權(quán)限,并且不應(yīng)該銷毀或更改Unix權(quán)限,即使在Windows系統(tǒng)上不支持Unix權(quán)限。

通過使程序像更高級的文件系統(tǒng)一樣處理不同的文件系統(tǒng),支持所有可能功能的超集:大小寫敏感、大小寫保留、Unicode形式敏感、Unicode形式保留、Unix權(quán)限、高分辨率納秒時(shí)間戳、擴(kuò)展屬性等。

在程序中保留大小寫后,如果需要與不區(qū)分大小寫的文件系統(tǒng)進(jìn)行交互,則可以始終實(shí)現(xiàn)大小寫不敏感。但是,如果你放棄了程序中的大小寫保留,你就無法安全地與保留大小寫的文件系統(tǒng)進(jìn)行交互,對于Unicode形式保留和時(shí)間戳分辨率保留也是如此。

如果文件系統(tǒng)為你提供小寫和大寫混合的文件名,則將文件名保留在給定的確切大小寫中,如果文件系統(tǒng)為你提供混合Unicode格式或NFC或NFD(或NFKC或NFKD)的文件名,則將文件名保留在給定的確切字節(jié)序列中,如果文件系統(tǒng)為你提供毫秒時(shí)間戳,則保持時(shí)間戳以毫秒為單位。

當(dāng)你使用較小的文件系統(tǒng)時(shí),你可以始終適當(dāng)?shù)剡M(jìn)行下采樣,使用運(yùn)行程序的文件系統(tǒng)的行為所需的比較函數(shù)。如果你知道文件系統(tǒng)不支持Unix權(quán)限,那么你不應(yīng)該期望讀取你編寫的相同Unix權(quán)限。如果你知道文件系統(tǒng)不保留大小寫,那么你應(yīng)該準(zhǔn)備在程序創(chuàng)建abc時(shí)在目錄列表中看到ABC。但是,如果你知道文件系統(tǒng)確實(shí)保留了大小寫,那么在檢測文件重命名或文件系統(tǒng)區(qū)分大小寫時(shí),你應(yīng)該將ABC視為與abc不同的文件名。

大小寫保留

你可以創(chuàng)建一個名為test/abc的目錄,有時(shí)會驚奇地發(fā)現(xiàn)fs.readdir("test")返回["ABC"],這不是Node中的bug,Node返回文件系統(tǒng)存儲它的文件名,并非所有文件系統(tǒng)都支持大小寫保留,某些文件系統(tǒng)將所有文件名轉(zhuǎn)換為大寫(或小寫)。

Unicode形式保留

大小寫保留和Unicode形式保留是類似的概念,要理解為什么應(yīng)該保留Unicode形式,請確保首先理解為什么要保留大小寫,如果正確理解,Unicode形式保留就一樣簡單。

Unicode可以使用幾個不同的字節(jié)序列對相同的字符進(jìn)行編碼,幾個字符串可能看起來相同,但具有不同的字節(jié)序列。使用UTF-8字符串時(shí),請注意你的期望與Unicode的工作方式一致。正如你不希望所有UTF-8字符編碼為單個字節(jié)一樣,你不應(yīng)期望幾個在人眼看起來相同的UTF-8字符串具有相同的字節(jié)表示,這可能是你可以擁有ASCII而不是UTF-8的期望。

你可以創(chuàng)建一個名為test/café的目錄(NFC Unicode形式,字節(jié)序列<63 61 66 c3 a9>并且string.length === 5)并且有時(shí)你會驚訝地發(fā)現(xiàn)fs.readdir("test")返回["café"](NFD Unicode形式,字節(jié)序列<63 61 66 65 cc 81>并且string.length === 6),這不是Node中的bug。Node返回文件系統(tǒng)存儲時(shí)的文件名,并非所有文件系統(tǒng)都支持Unicode形式保留。

例如,HFS+會將所有文件名規(guī)范化為幾乎總是與NFD形式相同的形式,不要指望HFS+的行為與NTFS或EXT4相同,反之亦然。不要試圖通過規(guī)范化永久地更改數(shù)據(jù)作為掩蓋文件系統(tǒng)之間Unicode差異的漏洞抽象,這會產(chǎn)生問題而不解決任何問題,相反,保留Unicode形似并僅使用規(guī)范化作為比較函數(shù)。

Unicode形式不敏感

Unicode形式不敏感和Unicode形式保留是兩種不同的文件系統(tǒng)行為,經(jīng)?;ハ嗾`解。正如在存儲和傳輸文件名時(shí)將文件名永久規(guī)范化為大寫一樣,有時(shí)不正確地實(shí)現(xiàn)了大小寫不敏感,因此,在存儲和傳輸文件名時(shí),通過將文件名永久規(guī)范化為某種Unicode格式(在HFS+的情況下為NFD),有時(shí)會錯誤地實(shí)現(xiàn)Unicode格式不敏感性。通過使用Unicode規(guī)范化進(jìn)行比較,可以并且更好地實(shí)現(xiàn)Unicode形式不敏感而不犧牲Unicode形式保留。

比較不同的Unicode形式

Node提供string.normalize("NFC" / "NFD"),你可以使用它將UTF-8字符串規(guī)范化為NFC或NFD,你永遠(yuǎn)不應(yīng)該存儲此函數(shù)的輸出,而只是將其用作比較函數(shù)的一部分,以測試兩個UTF-8字符串對于用戶是否看起來相同。

你可以使用string1.normalize("NFC") === string2.normalize("NFC")string1.normalize("NFD") === string2.normalize("NFD")作為比較函數(shù),你使用哪種形式并不重要。

規(guī)范化很快但你可能希望使用緩存作為比較函數(shù)的輸入,以避免多次規(guī)范化相同的字符串,如果該字符串不在緩存中,則對其進(jìn)行規(guī)范化并對其進(jìn)行緩存,注意不要存儲或保留緩存,只能將其用作緩存。

請注意,使用normalize()要求你的Node版本包含ICU(否則normalize()將返回原始字符串),如果你從網(wǎng)站下載最新版本的Node,那么它將包括ICU。

時(shí)間戳分辨率

你可以將文件的mtime(修改時(shí)間)設(shè)置為1444291759414(毫秒分辨率),并有時(shí)驚訝地發(fā)現(xiàn)fs.stat將新mtime返回為1444291759000(1秒分辨率)或1444291758000(2秒分辨率),這不是Node中的bug。Node返回文件系統(tǒng)存儲它的時(shí)間戳,并非所有文件系統(tǒng)都支持納秒、毫秒或1秒時(shí)間戳分辨率。有些文件系統(tǒng)甚至對atime時(shí)間戳的分辨率非常粗糙,例如,對于一些FAT文件系統(tǒng),分辨率為24小時(shí)。

不要通過規(guī)范化來破壞文件名和時(shí)間戳

文件名和時(shí)間戳是用戶數(shù)據(jù),正如你永遠(yuǎn)不會自動重寫用戶文件數(shù)據(jù)以使數(shù)據(jù)大寫或?qū)?b>CRLF規(guī)范化為LF行結(jié)束一樣,因此你不應(yīng)該通過大小寫/Unicode格式/時(shí)間戳規(guī)范化來更改、干擾或損壞文件名或時(shí)間戳,規(guī)范化只應(yīng)用于比較,絕不能用于改變數(shù)據(jù)。

規(guī)范化實(shí)際上是有損哈希碼,你可以使用它來測試某些類型的等價(jià)性(例如,即使它們具有不同的字節(jié)序列,幾個字符串看起來相同)但你永遠(yuǎn)不能將它用作實(shí)際數(shù)據(jù)的替代品,你的程序應(yīng)按原樣傳遞文件名和時(shí)間戳數(shù)據(jù)。

你的程序可以在NFC中創(chuàng)建新數(shù)據(jù)(或者以其喜歡的任何Unicode形式組合)或使用小寫或大寫文件名,或者使用2秒的分辨率時(shí)間戳,但是你的程序不應(yīng)該通過強(qiáng)加大小寫/Unicode形式/時(shí)間戳規(guī)范化來破壞現(xiàn)有的用戶數(shù)據(jù)。相反,采用超集方法并在程序中保留大小寫、Unicode格式和時(shí)間戳分辨率,這樣,你就可以安全地與執(zhí)行相同操作的文件系統(tǒng)進(jìn)行交互。

適當(dāng)?shù)厥褂脴?biāo)準(zhǔn)化比較功能

確保正確使用大小寫/Unicode形式/時(shí)間戳比較功能,如果你正在處理區(qū)分大小寫的文件系統(tǒng),請不要使用不區(qū)分大小寫的文件名比較函數(shù)。如果你正在使用Unicode形式敏感文件系統(tǒng)(例如NTFS和大多數(shù)保留NFC和NFD或混合Unicode形式的Linux文件系統(tǒng)),請不要使用Unicode形式不敏感的比較函數(shù)。如果你正在使用納秒時(shí)間戳分辨率文件系統(tǒng),請不要以2秒分辨率比較時(shí)間戳。

為比較功能的微小差異做好準(zhǔn)備

請注意你的比較函數(shù)與文件系統(tǒng)的比較函數(shù)匹配(或者如果可能的話探測文件系統(tǒng)以查看它實(shí)際比較的方式),例如,不區(qū)分大小寫比簡單的toLowerCase()比較復(fù)雜,事實(shí)上,toUpperCase()通常比toLowerCase()更好(因?yàn)樗圆煌姆绞教幚砟承┩庹Z字符)。但更好的方法是探測文件系統(tǒng),因?yàn)槊總€文件系統(tǒng)都有自己的大小寫比較表。

例如,Apple的HFS+將文件名規(guī)范化為NFD格式,但這種NFD格式實(shí)際上是當(dāng)前NFD格式的舊版本,有時(shí)可能與最新的Unicode標(biāo)準(zhǔn)的NFD格式略有不同,不要指望HFS+ NFD始終與Unicode NFD完全相同。

上一篇:HTTP事務(wù)的剖析 下一篇:流中的背壓

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/100319.html

相關(guān)文章

  • Node.js 指南(ABI穩(wěn)定性)

    摘要:確保兼容性的剩余責(zé)任在于團(tuán)隊(duì)維護(hù)頭文件,這些頭文件提供了在編譯時(shí)在中保持穩(wěn)定的。中的穩(wěn)定性提供由幾個獨(dú)立團(tuán)隊(duì)維護(hù)的頭文件,例如,團(tuán)隊(duì)維護(hù)諸如和之類的頭文件。由團(tuán)隊(duì)維護(hù),盡管與團(tuán)隊(duì)密切合作,但該團(tuán)隊(duì)是獨(dú)立的,并且有自己的時(shí)間表和優(yōu)先級。 ABI穩(wěn)定性 介紹 應(yīng)用程序二進(jìn)制接口(ABI)是程序調(diào)用函數(shù)和使用其他編譯程序的數(shù)據(jù)結(jié)構(gòu)的一種方法,它是應(yīng)用程序編程接口(API)的編譯版本,換句話說...

    Simon_Zhou 評論0 收藏0
  • Node.js 指南(流中背壓)

    摘要:在數(shù)據(jù)緩沖區(qū)已超過或?qū)懭腙?duì)列當(dāng)前正忙的任何情況下,將返回。當(dāng)返回值時(shí),背壓系統(tǒng)啟動,它會暫停傳入的流發(fā)送任何數(shù)據(jù),并等待消費(fèi)者再次準(zhǔn)備就緒,清空數(shù)據(jù)緩沖區(qū)后,將發(fā)出事件并恢復(fù)傳入的數(shù)據(jù)流。 流中的背壓 在數(shù)據(jù)處理過程中會出現(xiàn)一個叫做背壓的常見問題,它描述了數(shù)據(jù)傳輸過程中緩沖區(qū)后面數(shù)據(jù)的累積,當(dāng)傳輸?shù)慕邮斩司哂袕?fù)雜的操作時(shí),或者由于某種原因速度較慢時(shí),來自傳入源的數(shù)據(jù)就有累積的趨勢,就像...

    Tony 評論0 收藏0
  • Node.js 日志輸出指南

    摘要:將如下代碼寫入到文件中,并在環(huán)境里執(zhí)行如圖雖然這兩個輸出看起來可能一樣,但系統(tǒng)實(shí)際上對它的處理方式有不同。如圖如果你沒有啟動調(diào)試日志,則不會看到任何這樣的日志輸出。 原文地址: https://www.twilio.com/blog/g...原文作者: DOMINIK KUNDEL 翻譯作者: icepy 翻譯出處: https://github.com/lightningm... ...

    csRyan 評論0 收藏0
  • 【譯】Node.js 前端開發(fā)指南

    摘要:定時(shí)器在和瀏覽器中的表現(xiàn)形式是相同的。關(guān)于定時(shí)器的一個重要的事情是,我們提供的延遲不代表在這個時(shí)間之后回調(diào)就會被執(zhí)行。它的真正含義是,一旦主線程完成所有操作包括微任務(wù)并且沒有其它具有更高優(yōu)先級的定時(shí)器,將在此時(shí)間之后執(zhí)行回調(diào)。 眾成翻譯 原文鏈接 關(guān)于作者 2018年6月21日出版? 本指南面向了解Javascript但尚未十分熟悉Node.js的前端開發(fā)人員。我這里不專注于語言本身...

    CntChen 評論0 收藏0
  • Electron指南 - 快速入門

    摘要:快速入門提供了豐富的本地操作系統(tǒng)的,使你能夠使用純來創(chuàng)建桌面應(yīng)用程序。這并不意味著是一個綁定圖形用戶界面的庫。每個頁面在里是運(yùn)行在自己的進(jìn)程里,這些進(jìn)程被稱為渲染進(jìn)程。有些只能在該事件發(fā)生后才能被使用。 快速入門 Electron提供了豐富的本地(操作系統(tǒng))的API,使你能夠使用純JavaScript來創(chuàng)建桌面應(yīng)用程序。與其它各種的Node.js運(yùn)行時(shí)不同的是Electron專注于桌面...

    SQC 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<