我犯了將檔案路徑視為字串的錯誤

2021-10-05 21:14:00 字數 2642 閱讀 3068

您作為開發人員所做的某些事情可以為您工作多年,然後在您最不期望的時候轉過身來咬您。 這些都是您希望其他開發人員在您職業生涯的早期就告訴您的,因此您不必犯錯誤。 這篇文章是關於這些事情之一的,如果您正在閱讀本文,請考慮一下我告訴您。

檔案路徑看起來像字串。 您有許多目錄,也許還有乙個以副檔名結尾的檔名。 您使用`/`字元分隔目錄和檔案,結果看起來類似於`/path/to/filefile`。 因此,您可以將它們視為字串,將它們連線或串聯起來,直到將它們傳遞給另乙個用於讀取或寫入檔案的檔案方法為止。 這些是我幾個月前的想法。 這是我錯的地方。

如果您在mac上(例如我有特權)或linux進行開發,那麼您可能已經閱讀了上面的段落,而沒有發現任何錯誤。 如果在windows上進行開發,則在閱讀`/`字元時,您可能會嘆口氣。

就像我多年以來所做的那樣,當您使用mac並部署到linux環境時, windows總是使用反斜槓 ,這太容易忘記了。 當您在需要在兩種型別的平台上執行的命令列工具上工作時,發現自己犯了這個錯誤是非常痛苦的。 create-twilio-function是一種這樣的命令列工具,它必須對以下方面進行一些

更改 :

mkdir(path + '/' + dirname);

const path = require ( 'path' );

mkdir(path.join(pathname, dirname));

這樣它就可以在windows上正常工作。

對於windows使用者,對不起。 對於其他所有人,在使用node.js時, `path`模組是您的朋友。 每當需要連線兩個路徑時​​,請使用path.join。 並檢查其他實用程式,例如path.relative,它返回從乙個路徑到另一路徑的相對路徑,以及path.normalize,它返回解析段(如..或`..`)的路徑。

不用理會path.sep,它會根據您正在使用的系統返回乙個/或乙個\,只需使用path.join即可

我的第二個錯誤是這次使用ruby。 這個比較微妙,迴避了我的測試。 您會看到,可以使用`pathname類建立路徑的片段,然後將它們連線起來。 例如:

require "pathname"

path1 = pathname.new( "path" )

path2 = pathname.new( "to" )

path1 + path2

# => #

如您所見,「pathname」物件具有連線路徑的「+」運算子,就像「+」連線字串一樣。 實際上,它還可以結合使用字串和路徑:

require "pathname"

path1 = pathname.new( "path" )

path2 = "to"

path1 + path2

# => #

一切似乎都很好,只是它無法正常工作。

require "pathname"

path1 = "to"

path2 = pathname.new( "path" )

path1 + path2

# => typeerror (no implicit conversion of pathname into string)

這樣的錯誤意味著我們做錯了什麼,但這不是我遇到的問題。 不,我曾希望連線乙個路徑名和乙個字串,而不是連線兩個字串。 這體現在我的rubygem`jekyll-gzip`中 。 您看,我正在嘗試用以下行建立一組路徑:

files = dir.glob(dir + "**/* }" )

事實證明,在某些情況下,dir實際上是乙個字串而不是路徑名,並且不包含分隔符。 因此,當我真的希望它尋找`"dirname/** /*}"`時,全域性變數正在尋找`"dirname **/*}""dirname/** /*}"`。 串聯兩個路徑名或乙個路徑名和乙個字串將新增分隔符( 正如有人在對我的commit的注釋中指出的那樣 ),但是串聯兩個字串則不會。 這意味著gem開心地去尋找錯誤的路徑名,沒有找到檔案,然後繼續成功地執行任何操作。 用以下內容替換整行:

files = dir.glob(file.join(dir, "**" , "* }" ))

解決了這個問題。 在這種情況下,file.join是避免字串意外的方法。

無論您使用的是node.js,ruby還是任何其他語言,都不要試圖將檔案路徑視為字串。 它們在不同平台上的行為不同,並且路徑和字串混合在一起會導致難以除錯的錯誤。

使用您的標準庫,節省您的麻煩。

先前發布在

from:

Python字串中的檔案路徑

在windows上使用python時,經常會被檔案路徑報出的錯誤搞蒙 第一種錯誤 比如open c users administrator desktop test.doc read 就會報 syntaxerror unicode error unicodeescape codec can t de...

將字串轉化為時間,犯了乙個低階錯誤

今天犯了了個很低階的錯誤,想把uidatepickview的預設選中時間設定為當前時間的下一天的11 30,我的思路 首先獲取當前時間 將當前時間字串化 擷取次字串,分理處當前的年月日中得日 將日 1 然後字串拼接成自己想要的日期格式 將拼接成的日期轉化成nsdate 然後設定預設時間 我犯的錯誤,...

C 從字串獲取檔案路徑

c 從字串獲取檔案路徑 c 擷取帶路徑的檔案名字,副檔名,等等 的幾種方法 c 對磁碟io操作的時候,經常會用到這些,路徑,檔案,檔案名字,副檔名.之前,經常用切割字串來實現,可是經常會弄錯.尤其是啟始位置,多少個位元組,經常弄暈.下面這種方法貌似比較簡便 string filepath e ran...