[swiftui] - FileManager文件管理

//1)首先我們獲取用戶文檔目錄路徑

? ? ? ? let manager = FileManager.default

? ? ? ? let urlForDocument = manager.urls(for: .documentDirectory, in:.userDomainMask)

? ? ? ? let url = urlForDocument[0] as URL

? ? ? ? print(url)

//2)對指定路徑執(zhí)行淺搜索,返回指定目錄路徑下的文件、子目錄及符號鏈接的列表

? ? ? ? let contentsOfPath = try? manager.contentsOfDirectory(atPath: url.path)

? ? ? ? print("contentsOfPath: \(contentsOfPath)")


//3)類似上面的,對指定路徑執(zhí)行淺搜索,返回指定目錄路徑下的文件、子目錄及符號鏈接的列表

? ? ? ? let contentsOfURL = try? manager.contentsOfDirectory(at: url, includingPropertiesForKeys: nil, options: .skipsHiddenFiles)

? ? ? ? print("contentsOfURL: \(contentsOfURL)")


//4)深度遍歷,會遞歸遍歷子文件夾(但不會遞歸符號鏈接)

? ? ? ? let enumeratorAtPath = manager.enumerator(atPath: url.path)

? ? ? ? print("enumeratorAtPath: \(enumeratorAtPath?.allObjects)")

//5)類似上面的,深度遍歷,會遞歸遍歷子文件夾(但不會遞歸符號鏈接)

? ? ? ? let enumeratorAtURL = manager.enumerator(at: url, includingPropertiesForKeys: nil, options: .skipsHiddenFiles, errorHandler:nil)

? ? ? ? print("enumeratorAtURL: \(enumeratorAtURL?.allObjects)")



//6)深度遍歷,會遞歸遍歷子文件夾(包括符號鏈接,所以要求性能的話用enumeratorAtPath)

? ? ? ? let subPaths = manager.subpaths(atPath: url.path)

? ? ? ? print("subPaths: \(subPaths)")


//? ? ? ? 2,判斷文件或文件夾是否存在

? ? ? ? let fileManager = FileManager.default

? ? ? ? let filePath:String = NSHomeDirectory() + "/Documents/hangge.txt"

? ? ? ? let exist = fileManager.fileExists(atPath: filePath)


//? ? ? ? 3,創(chuàng)建文件夾

//? ? ? ? 方式1:

? ? ? ? let myDirectory:String = NSHomeDirectory() + "/Documents/myFolder/Files"

? ? ? ? let fileManager = FileManager.default

? ? ? ? //withIntermediateDirectories為ture表示路徑中間如果有不存在的文件夾都會創(chuàng)建

? ? ? ? try! fileManager.createDirectory(atPath: myDirectory, withIntermediateDirectories: true, attributes: nil)

//? ? ? ? 方式2:

? ? ? ? func createFolder(name:String,baseUrl:NSURL){

? ? ? ? ? ? let manager = FileManager.default

? ? ? ? ? ? let folder = baseUrl.appendingPathComponent(name, isDirectory: true)

? ? ? ? ? ? print("文件夾: \(folder)")

? ? ? ? ? ? let exist = manager.fileExists(atPath: folder!.path)

? ? ? ? ? ? if !exist {

? ? ? ? ? ? ? ? try! manager.createDirectory(at: folder!, withIntermediateDirectories: true,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? attributes: nil)

? ? ? ? ? ? }

? ? ? ? }


? ? ? ? //在文檔目錄下新建folder目錄

? ? ? ? let manager = FileManager.default

? ? ? ? let urlForDocument = manager.urls(for: .documentDirectory, in: .userDomainMask)

? ? ? ? let url = urlForDocument[0] as NSURL

? ? ? ? createFolder(name: "folder", baseUrl: url)


//? ? ? ? 4,將對象寫入文件

//? ? ? ? 可以通過write(to:)方法,可以創(chuàng)建文件并將對象寫入,對象包括String,NSString,UIImage,NSArray,NSDictionary等。

//? ? ? ? (1)把String保存到文件

//

? ? ? ? let filePath:String = NSHomeDirectory() + "/Documents/hangge.txt"

? ? ? ? let info = "歡迎來到hange.com"

? ? ? ? try! info.write(toFile: filePath, atomically: true, encoding: String.Encoding.utf8)

//? ? ? ? (2)把圖片保存到文件路徑下

? ? ? ? let filePath = NSHomeDirectory() + "/Documents/hangge.png"

? ? ? ? let image = UIImage(named: "apple.png")

? ? ? ? let data:Data = UIImagePNGRepresentation(image!)!

? ? ? ? try? data.write(to: URL(fileURLWithPath: filePath))


//? ? ? ? (3)把NSArray保存到文件路徑下

? ? ? ? let array = NSArray(objects: "aaa","bbb","ccc")

? ? ? ? let filePath:String = NSHomeDirectory() + "/Documents/array.plist"

? ? ? ? array.write(toFile: filePath, atomically: true)


//? ? ? ? (4)把NSDictionary保存到文件路徑下

? ? ? ? let dictionary:NSDictionary = ["Gold": "1st Place", "Silver": "2nd Place"]

? ? ? ? let filePath:String = NSHomeDirectory() + "/Documents/dictionary.plist"

? ? ? ? dictionary.write(toFile: filePath, atomically: true)


//? ? ? ? 5,創(chuàng)建文件

? ? ? ? func createFile(name:String, fileBaseUrl:URL){

? ? ? ? ? ? let manager = FileManager.default

? ? ? ? ? ? let file = fileBaseUrl.appendingPathComponent(name)

? ? ? ? ? ? print("文件: \(file)")

? ? ? ? ? ? let exist = manager.fileExists(atPath: file.path)

? ? ? ? ? ? if !exist {

? ? ? ? ? ? ? ? let data = Data(base64Encoded:"aGVsbG8gd29ybGQ=" ,options:.ignoreUnknownCharacters)

? ? ? ? ? ? ? ? let createSuccess = manager.createFile(atPath: file.path,contents:data,attributes:nil)

? ? ? ? ? ? ? ? print("文件創(chuàng)建結(jié)果: \(createSuccess)")

? ? ? ? ? ? }

? ? ? ? }


? ? ? ? //在文檔目錄下新建test.txt文件

? ? ? ? let manager = FileManager.default

? ? ? ? let urlForDocument = manager.urls( for: .documentDirectory, in:.userDomainMask)

? ? ? ? let url = urlForDocument[0]

? ? ? ? createFile(name:"test.txt", fileBaseUrl: url)

? ? ? ? //createFile(name: "folder/new.txt", fileBaseUrl: url)


//? ? ? ? 6,復(fù)制文件

//? ? ? ? (1)方法1

? ? ? ? let fileManager = FileManager.default

? ? ? ? let homeDirectory = NSHomeDirectory()

? ? ? ? let srcUrl = homeDirectory + "/Documents/hangge.txt"

? ? ? ? let toUrl = homeDirectory + "/Documents/copyed.txt"

? ? ? ? try! fileManager.copyItem(atPath: srcUrl, toPath: toUrl)


//? ? ? ? (2)方法2

? ? ? ? // 定位到用戶文檔目錄

? ? ? ? let manager = FileManager.default

? ? ? ? let urlForDocument = manager.urls( for:.documentDirectory, in:.userDomainMask)

? ? ? ? let url = urlForDocument[0]


? ? ? ? // 將test.txt文件拷貝到文檔目錄根目錄下的copyed.txt文件

? ? ? ? let srcUrl = url.appendingPathComponent("test.txt")

? ? ? ? let toUrl = url.appendingPathComponent("copyed.txt")

? ? ? ? try! manager.copyItem(at: srcUrl, to: toUrl)


//? ? ? ? 7,移動文件

//? ? ? ? (1)方法1

? ? ? ? let fileManager = FileManager.default

? ? ? ? let homeDirectory = NSHomeDirectory()

? ? ? ? let srcUrl = homeDirectory + "/Documents/hangge.txt"

? ? ? ? let toUrl = homeDirectory + "/Documents/moved/hangge.txt"

? ? ? ? try! fileManager.moveItem(atPath: srcUrl, toPath: toUrl)


//? ? ? ? (2)方法2

? ? ? ? // 定位到用戶文檔目錄

? ? ? ? let manager = FileManager.default

? ? ? ? let urlForDocument = manager.urls( for: .documentDirectory, in:.userDomainMask)

? ? ? ? let url = urlForDocument[0]

? ? ? ? let srcUrl = url.appendingPathComponent("test.txt")

? ? ? ? let toUrl = url.appendingPathComponent("copyed.txt")

? ? ? ? // 移動srcUrl中的文件(test.txt)到toUrl中(copyed.txt)

? ? ? ? try! manager.moveItem(at: srcUrl, to: toUrl)


? ? ? // 8,刪除文件

? ? ? ? (1)方法1

? ? ? ? let fileManager = FileManager.default

? ? ? ? let homeDirectory = NSHomeDirectory()

? ? ? ? let srcUrl = homeDirectory + "/Documents/hangge.txt"

? ? ? ? try! fileManager.removeItem(atPath: srcUrl)


? ? ? // (2)方法2

? ? ? ? // 定位到用戶文檔目錄

? ? ? ? let manager = FileManager.default

? ? ? ? let urlForDocument = manager.urls(for: .documentDirectory, in:.userDomainMask)

? ? ? ? let url = urlForDocument[0]

? ? ? ? let toUrl = url.appendingPathComponent("copyed.txt")

? ? ? ? // 刪除文檔根目錄下的toUrl路徑的文件(copyed.txt文件)

? ? ? ? try! manager.removeItem(at: toUrl)


? ? ? // 9,刪除目錄下所有的文件

? ? ? ? //(1)方法1:獲取所有文件,然后遍歷刪除

? ? ? ? let fileManager = FileManager.default

? ? ? ? let myDirectory = NSHomeDirectory() + "/Documents/Files"

? ? ? ? let fileArray = fileManager.subpaths(atPath: myDirectory)

? ? ? ? for fn in fileArray!{

? ? ? ? ? ? try! fileManager.removeItem(atPath: myDirectory + "/\(fn)")

? ? ? ? }


? ? ? ? //(2)方法2:刪除目錄后重新創(chuàng)建該目錄

? ? ? ? let fileManager = FileManager.default

? ? ? ? let myDirectory = NSHomeDirectory() + "/Documents/Files"

? ? ? ? try! fileManager.removeItem(atPath: myDirectory)

? ? ? ? try! fileManager.createDirectory(atPath: myDirectory, withIntermediateDirectories: true, attributes: nil)

? ? ? //? 10,讀取文件

? ? ? ? let manager = FileManager.default

? ? ? ? let urlsForDocDirectory = manager.urls(for: .documentDirectory, in:.userDomainMask)

? ? ? ? let docPath = urlsForDocDirectory[0]

? ? ? ? let file = docPath.appendingPathComponent("test.txt")


? ? ? ? //方法1

? ? ? ? let readHandler = try! FileHandle(forReadingFrom:file)

? ? ? ? let data = readHandler.readDataToEndOfFile()

? ? ? ? let readString = String(data: data, encoding: String.Encoding.utf8)

? ? ? ? print("文件內(nèi)容: \(readString)")


? ? ? ? //方法2

? ? ? ? let data2 = manager.contents(atPath: file.path)

? ? ? ? let readString2 = String(data: data2!, encoding: String.Encoding.utf8)

? ? ? ? print("文件內(nèi)容: \(readString2)")


? ? ? //? 11,在任意位置寫入數(shù)據(jù)

? ? ? ? let manager = FileManager.default

? ? ? ? let urlsForDocDirectory = manager.urls(for:.documentDirectory, in:.userDomainMask)

? ? ? ? let docPath = urlsForDocDirectory[0]

? ? ? ? let file = docPath.appendingPathComponent("test.txt")

? ? ? ? let string = "添加一些文字到文件末尾"

? ? ? ? let appendedData = string.data(using: String.Encoding.utf8, allowLossyConversion: true)

? ? ? ? let writeHandler = try? FileHandle(forWritingTo:file)

? ? ? ? writeHandler!.seekToEndOfFile()

? ? ? ? writeHandler!.write(appendedData!)


? ? ? // 12,文件權(quán)限判斷

? ? ? ? let manager = FileManager.default

? ? ? ? let urlForDocument = manager.urls(for: .documentDirectory, in:.userDomainMask)

? ? ? ? let docPath = urlForDocument[0]

? ? ? ? let file = docPath.appendingPathComponent("test.txt")

? ? ? ? let readable = manager.isReadableFile(atPath: file.path)

? ? ? ? print("可讀: \(readable)")

? ? ? ? let writeable = manager.isWritableFile(atPath: file.path)

? ? ? ? print("可寫: \(writeable)")

? ? ? ? let executable = manager.isExecutableFile(atPath: file.path)

? ? ? ? print("可執(zhí)行: \(executable)")

? ? ? ? let deleteable = manager.isDeletableFile(atPath: file.path)

? ? ? ? print("可刪除: \(deleteable)")


? ? ? //13,獲取文件屬性(創(chuàng)建時間,修改時間,文件大小,文件類型等信息)

? ? ? ? let manager = FileManager.default

? ? ? ? let urlForDocument = manager.urls(for: .documentDirectory, in:.userDomainMask)

? ? ? ? let docPath = urlForDocument[0]

? ? ? ? let file = docPath.appendingPathComponent("test.txt")

? ? ? ? let attributes = try? manager.attributesOfItem(atPath: file.path) //結(jié)果為Dictionary類型

? ? ? ? print("attributes: \(attributes!)")

? ? ? ? //從 attributes 中獲取具體的屬性:

? ? ? ? print("創(chuàng)建時間:\(attributes![FileAttributeKey.creationDate]!)")

? ? ? ? print("修改時間:\(attributes![FileAttributeKey.modificationDate]!)")

? ? ? ? print("文件大?。篭(attributes![FileAttributeKey.size]!)")



? ? ? // 14,文件/文件夾比較

? ? ? ? let manager = FileManager.default

? ? ? ? let urlForDocument = manager.urls(for: .documentDirectory, in:.userDomainMask)

? ? ? ? let docPath = urlForDocument[0]

? ? ? ? let contents = try! manager.contentsOfDirectory(atPath: docPath.path)

? ? ? ? //下面比較用戶文檔中前面兩個文件是否內(nèi)容相同(該方法也可以用來比較目錄)

? ? ? ? let count = contents.count

? ? ? ? if count > 1 {

? ? ? ? ? ? let path1 = docPath.path + "/" + (contents[0] as String)

? ? ? ? ? ? let path2 = docPath.path + "/" + (contents[1] as String)

? ? ? ? ? ? let equal = manager.contentsEqual(atPath: path1,andPath:path2)

? ? ? ? ? ? print("path1:\(path1)")

? ? ? ? ? ? print("path2:\(path2)")

? ? ? ? ? ? print("比較結(jié)果: \(equal)")

? ? ? ? }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容