@
目錄
首先獲取app文件夾:(以下例子都在doucment文件夾下操作)
let manager = FileManager.default
let urls: [URL] = manager.urls(for: .documentDirectory, in: .userDomainMask)
// .libraryDirectory、.cachesDirectory ...
self.documentURL = urls.first!
1、創建文件夾
let url = self.documentURL.appendingPathComponent("moxiaoyan", isDirectory: true)
var isDirectory: ObjCBool = ObjCBool(false)
let isExist = manager.fileExists(atPath: url.path, isDirectory: &isDirectory)
if !isExist {
do {
try manager.createDirectory(at: url, withIntermediateDirectories: true, attributes: nil)
} catch {
print("createDirectory error:\(error)")
}
}
2、創建文件,並寫入內容
let url = self.documentURL.appendingPathComponent("moxiaoyan/test1.txt", isDirectory: true) // txt文件會自動創建,只要給個名稱就行
let string = "moxiaoyan"
do {
try string.write(to: url, atomically: true, encoding: .utf8)
// Data、Array、Dictionary、Image 都可以write
} catch {
print("write string error:\(error)")
}
3、文件夾/文件 信息
let url = self.documentURL.appendingPathComponent("moxiaoyan", isDirectory: true) // or "moxiaoyan/test1.txt"
// 可讀、可寫、可執行、可刪除
let readable = manager.isReadableFile(atPath: url.path)
let writeable = manager.isWritableFile(atPath: url.path)
let executable = manager.isExecutableFile(atPath: url.path)
let deleteable = manager.isDeletableFile(atPath: url.path)
print("readable:\(readable) writeable:\(writeable) executable:\(executable) deleteable:\(deleteable)")
// NSFileCreationDate:創建時間、NSFileSize:文件大小、NSFileType:文件類型...
do {
let attributes: Dictionary = try manager.attributesOfItem(atPath: url.path)
print("attributes\(attributes)")
let fileSize = attributes[FileAttributeKey.size] as! Int
print("fileSize:\(fileSize)")
} catch {
print("attributes error: \(error)")
}
4、刪除 文件夾/文件
let url = self.documentURL.appendingPathComponent("moxiaoyan", isDirectory: true)
var isDirectory: ObjCBool = ObjCBool(false)
let isExist = manager.fileExists(atPath: url.path, isDirectory: &isDirectory)
if isExist {
do {
try manager.removeItem(at: url) // 刪除文件
// try manager.removeItem(atPath: url.path) // 刪除文件路徑
} catch {
print("removeItem error:\(error)")
}
}
5、清空文件夾
// 刪除文件夾里的所有文件,而不刪除文件夾
let url = self.documentURL.appendingPathComponent("moxiaoyan", isDirectory: true)
// 方法1:刪除,再創建
// self.deleteFile(name)
// self.createFile(name)
// 方法2:遍歷文件刪除
let files = manager.subpaths(atPath: url.path)
for file in files ?? [] {
do {
try manager.removeItem(atPath: url.path + "/\(file)") // 需要拼接路徑!!
} catch {
print("remove item:\(file)\n error:\(error)")
}
}
6、遍歷文件夾
let url = self.documentURL.appendingPathComponent("moxiaoyan", isDirectory: true)
// 1.1 淺遍歷:只有 文件夾/文件 名
do {
let contentsOfDirectory = try manager.contentsOfDirectory(atPath: url.path)
print("contentsOfDirectory:\(contentsOfDirectory)")
} catch {
print("1.1 淺遍歷 error:\(error)")
}
// 1.2 淺遍歷:包含完整路徑
do {
let contentsOfDirectory = try manager.contentsOfDirectory(at: url,
includingPropertiesForKeys: nil,
options: .skipsHiddenFiles)
print("skipsHiddenFiles:\(contentsOfDirectory)")
} catch {
print("1.2 淺遍歷 error:\(error)")
}
// 2.1 深度遍歷:只有當前文件夾下的路徑
let enumberatorAtPath = manager.enumerator(atPath: url.path)
print("2.1 深度遍歷:\(enumberatorAtPath?.allObjects)")
// 2.2 深度遍歷:包含完整路徑
let enumberatorAtURL = manager.enumerator(at: url,
includingPropertiesForKeys: nil,
options: .skipsHiddenFiles,
errorHandler: nil)
print("2.2 深度遍歷:\(enumberatorAtURL?.allObjects)")
7、文件寫入數據
let url = self.documentURL.appendingPathComponent("moxiaoyan/test1.txt", isDirectory: true)
guard let data = string.data(using: .utf8, allowLossyConversion: true) else {
return
}
// 1.寫在結尾
do {
let writeHandler = try FileHandle(forWritingTo: url)
writeHandler.seekToEndOfFile()
writeHandler.write(data)
} catch {
print("writeHandler error:\(error)")
}
// 2.從第n個字符開始覆蓋
do {
let writeHandler = try FileHandle(forWritingTo: url)
do {
try writeHandler.seek(toOffset: 1)
} catch {
print("writeHandler.seek error:\(error)")
}
writeHandler.write(data)
} catch {
print("writeHandler error:\(error)")
}
// 3.只保留前n個字符
do {
let writeHandler = try FileHandle(forWritingTo: url)
do {
try writeHandler.truncate(atOffset: 1)
} catch {
print("writeHandler.truncate error:\(error)")
}
writeHandler.write(data)
} catch {
print("writeHandler error:\(error)")
}
// 4.只保留前n個字符:(n超過原字符長度,則並接在結尾)
do {
let writeHandler = try FileHandle(forWritingTo: url)
writeHandler.truncateFile(atOffset: 12)
writeHandler.write(data)
} catch {
print("writeHandler error:\(error)")
}
8、讀取文件內容
let url = self.documentURL.appendingPathComponent("moxiaoyan/test1.txt", isDirectory: true)
// 方法1:
guard let data = manager.contents(atPath: url.path) else {
return
}
let readString = String(data: data, encoding: .utf8)
print("方法1:\(readString ?? "")")
// 方法2:
guard let readHandler = FileHandle(forReadingAtPath: url.path) else {
return
}
guard let data2: Data = readHandler.readDataToEndOfFile() else {
return
}
let readString2 = String(data: data2, encoding: .utf8)
print("方法2:\(readString2 ?? "")")
9、復制文件
let file1 = self.documentURL.appendingPathComponent("moxiaoyan/test1.txt")
let file2 = self.documentURL.appendingPathComponent("moxiaoyan/test2.txt")
do {
// try manager.copyItem(at: file1, to: file2) // 直接復制文件
try manager.copyItem(atPath: file1.path, toPath: file2.path) // 復制文件內容
} catch {
print("copyItem error:\(error)")
}
10、移動文件
let url = self.documentURL.appendingPathComponent(name, isDirectory: true)
let file1 = url.appendingPathComponent(name)
print("文件1:\(file1)")
let file2 = url.appendingPathComponent(to + "/test1.txt")
print("文件2:\(file2)")
do {
// try manager.moveItem(atPath: file1.path, toPath: file2.path) // 直接拷貝文件
try manager.moveItem(at: file1, to: file2) // 拷貝文件內容
} catch {
print("moveItem error:\(error)")
}
11、比較文件
let file1 = self.documentURL.appendingPathComponent(name1)
let file2 = self.documentURL.appendingPathComponent(name2)
// 參數必須的是路徑(相同字符串false)
let equal = manager.contentsEqual(atPath: file1.path, andPath: file2.path)
print("file1:\(file1)")
print("file2:\(file2)")
print("equal:\(equal)")