Mac 檔案處理庫,原始碼分析

2021-10-14 12:29:25 字數 2908 閱讀 2184

johnsundell/files 這個檔案處理庫,封裝的挺好

本文看一下其源**

磁碟上的分為兩種,檔案和資料夾

public enum locationkind
檔案和資料夾的共性是,他有乙個路徑,

操作他們,都要filemanager

將檔案和資料夾的共性,封裝為storage

增刪改查的具體實現,交給這個類

public final class storage
將檔案和資料夾,抽象為 location

通用的增刪改查方法,放在location裡面。

location 分為兩種,使用列舉 locationkind 區分型別

具體資訊,記錄在storage裡面

public protocol location: equatable, customstringconvertible 

var storage: storage

init(storage: storage)

}

將檔案,封裝為 file

檔案的讀寫,放在這個結構體中

public struct file: location 

}

將資料夾,封裝為folder

處理子資料夾,根目錄等

public struct folder: location 

}

1, 例項化資料夾

location 協議有乙個擴充套件方法,

拿資料夾路徑去例項化

// 裡面呼叫 `folder ` 遵守 `location` 協議,實現的 `init(storage: storage)`

public extension location

}

2, 獲取檔案目錄

裡面呼叫storage的建立子列表的方法

public extension folder 

}

建立子列表的方法,實現

一環套一環,層層封裝,

呼叫了乙個定義在folder裡面的類childsequence

private extension storage where locationtype == folder 

}

folder裡面的類childsequence

路徑資訊在folder裡面,

有兩個可選的屬性,

isrecursive, 要不要遞迴,檢視所有層次的資料夾,

includehidden, 要不要檢視隱藏的檔案和資料夾

預設從上到下排序

struct childsequence: sequence 

}

到底了,最後一層

有資料夾路徑,

有操作方式,要不要看裡面資料夾的資訊,要不要看隱藏的

剩下的,就好辦了

如果不用遞迴獲取,就比較簡單

loaditemnames()方法中,獲取這一層的檔名

有乙個索引index記錄,遍歷到了,換下乙個

struct childiterator: iteratorprotocol 

// 遵守 iteratorprotocol 協議,需要實現 next() 方法

public mutating func next() -> child?

guard let child = nested.next() else

nestediterators[0] = nested

return child

}let name = itemnames[index]

index += 1

if !includehidden

}let childpath = folder.path + name.removingprefix("/")

let childstorage = try? storage(path: childpath, filemanager: filemanager)

let child = childstorage.map(child.init)

if isrecursive

}return child ?? next()

}private func loaditemnames() -> [string]

}

mac 訪達中,重複檔案命名方式是,

擴充套件前,檔名後 + (1)

預設排序,重複檔案在前面,原檔案在後面

找到重複檔案,使用乙個指標儲存var current: file? = nil

再看後乙個檔案

let path = "\(nshomedirectory())/downloads"

let folder = try folder(path: path)

var current: file? = nil

for file in folder.files catch

print("----\n")

}current = nil

}if file.name.contains("(1")

}

庫原始碼檔案

庫原始碼檔案是不能被直接執行的原始碼檔案,它僅用於存放程式實體,這些程式實體可以被其他 使用 遵從你go語言規範 這裡的其他 是指與被使用的程式實體在同乙個原始碼檔案內,也可以在其他原始碼檔案,甚至其他 中。程式實體是變數 常量 函式 結構體和介面的統稱。必須先宣告程式實體,然後再去使用,程式實體的...

sigslot庫原始碼分析

言歸正傳,sigslot是乙個用標準c 語法實現的訊號與槽機制的函式庫,型別和執行緒安全。提到訊號與槽機制,恐怕最容易想到的就是大名鼎鼎的qt所支援的物件之間通訊的模式吧。不過這裡的訊號與槽雖然在概念上等價與qt所實現的訊號與槽,但是採用的僅僅是標準c 語法,不像qt採用了擴充套件c 語言的方式 q...

Volley原始碼分析 請求處理

總結 本篇分析分析volley如何生成請求,如何處理請求,以及請求如何返回。從分析中學習再做元件時如何處理請求。生產者 消費者模型描述的是共享的緩衝區的兩類執行緒,一類是新增訊息的生產者,一類是處理訊息的消費者。而基本涉及到的多執行緒處理的均使用這個模型。比如glide,比如這邊文件分析的volle...