無論是Unix-like作業系統(如Linux、macOS)或是Windows作業系統的檔案路徑,皆有支援點(.)與點點(..)的功能。點(.)被用來表示「目前路徑的節點」或是「目前的工作目錄」,例如「/path/./to」或是「./path/to」;點點(..)則被用來表示「目前路徑的節點的上一層節點」或是「目前的工作目錄的上一層目錄」,例如「/path/../to」或是「../path/to」。在程式處理的過程中,或是需要輸出一些Log資訊的時候,我們也許會需要去有效地解析路徑中的點(.)與點點(..),目的是使路徑更簡單,就能更容易處理與辨別。而在這個單純情況下,我們不一定是要將該路徑轉成「絕對路徑」,也可能會希望被移除點(.)與點點(..)後的路徑同樣能夠是「相對路徑」。



這篇文章中,介紹了使用Rust程式語言標準函式庫提供的「canonicalize」函數或是「Path Absolutize」套件的方式,來將一個路徑的點(.)與點點(..)有效移除並轉成絕對路徑。如果我們並不想強制將路徑轉成絕對路徑,則可以使用「Path Dedot」這個套件。

Path Dedot

「Path Dedot」是筆者開發的套件,可以單純有效地解析檔案路徑中的點(.)或是點點(..)。事實上,「Path Absolutize」套件就是使用「Path Dedot」套件來做點(.)與點點(..)的解析。

Crates.io

https://crates.io/crates/path-dedot

Cargo.toml

path-dedot = "*"

使用方法

使用「use」關鍵字來將「path-dedot」這個crate底下的「ParseDot」特性給引用到當前的程式範圍下,「Path」和「PathBuf」結構體就會擁有「parse_dot」方法了!這個方法可以將路徑轉換成沒有點(.)與點點(..)路徑。

轉換規則如下:

  • 如果路徑不是以點(.)或點點(..)開頭,則點(.)會被忽略,點點(..)表示為上一層節點。
  • 如果路徑是以點(.)或點點(..)開頭,則點(.)表示目前的工作目錄路徑,點點(..)表示目前的工作目錄的上一層目錄。如果目前的工作目錄是根目錄,其上一層目錄也依然還是根目錄。
  • 原路徑如果是一個不是以點(.)或點點(..)開頭的相對路徑,不論原路徑中的點點(..)有多少個,轉換出來的路徑均不會向上超出這個原路徑。
  • 原路徑如果是有包含點點(..)的絕對路徑,不論原路徑中的點點(..)有多少個,轉換出來的絕對路徑均不會向上超出根目錄。
Path Dedot有跨作業系統嗎?

上面貌似都是以Unix-like作業系統(如Linux、macOS)的檔案路徑來舉例,那如果是要用在Windows作業系統呢?別擔心,「Path Dedot」也是有支援Windows作業系統的,使用方式也完全一樣!例如: