轉載自:http://www.coloroud.com/2015/06/01/Swift-File-Manager/
開頭
看來Swift這趟渾水是非干不可,既然如此,那索性就來的徹底吧,來一次全方位,深入的學習之旅。
進入正題,在Swift開發中,幾乎是每一個App都需要在本地存儲一些本地的持久化數據,畢竟不可能每次App使用都從網上現傳數據回來使用吧,那樣App的體驗將會大打折扣。
ios存儲特性
在ios體系中,每個app都是獨立的,遵循沙盒機制,app之間數據相互隔離,換個更通俗易懂的說法,你可以把每個App看成是一個用戶,就像在Linux系統中,每個用戶有一個獨立的home目錄,該用戶只對他的用戶目錄具有各項操作權。一般來所,程序之間是不可以相互訪問的。
目錄結構
Apple自ios8以后,app目錄結構發生了一些變化,ios8以前按App的Bundle(程序包)和app其他目錄放在一起,ios8以后,Bundle被獨立起來,和其他的Bundle放在一起,app目錄文件相關的數據文件放在一起。
file://~/Library/Developer/CoreSimulator/Devices/模擬器編號/data/Containers/Bundle/Application/app目錄對應的目錄編號 file://~/Library/Developer/CoreSimulator/Devices/模擬器編號/data/Containers/Data/Application/app目錄對應的目錄編號 // 注:上面‘~/‘指的是你的用戶主目錄,比如我的是:/Users/anoxia,而Library/Developer/CoreSimulator/ 是模擬器地址。
當我創建完App,會在沙盒中創建三個文件夾:Document,Library,tmp。
Document:用來存放一些應用持久化數據,可以進行一下文件或文件夾的創建,移動和刪除等操作。iTunes備份和恢復時,會包含此目錄。
Library:應用一些設置信息及其他狀態信息存放於此。
tmp:臨時文件存放的目錄,當ios重啟時,會清空里面的數據。
獲取各目錄路徑
Bundle目錄相關操作:
獲取應用Bundel包路徑:
var bundlePath = NSBundle.mainBundle().bundlePath // 包路徑 println(bunlePath)
獲取Bundel資源路徑:
var resourcePath = NSBundle.mainBundle().resourcePath // 資源路徑 println(resourcePath)
獲取應用可執行文件路徑
var executablePath = NSBundle.mainBundle().executablePath // App可執行文件路徑 println(executablePath)
在Bundel路徑中搜索文件
var infoPlistPath = NSBundle.mainBundle().URLForResource("Info", withExtension: "plist") println(infoPlistPath)
獲取應用根目錄:
var homePath = NSHomeDirectory() println(homePath)
獲取Document目錄:
var documentPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) println(documentPath.last)
獲取Library目錄
var libraryPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomainMask.UserDomainMask, true) println(libraryPath.last)
獲取Library下Caches
var cachePath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomainMask.UserDomainMask, true) println(cachePath.last)
獲取tmp
var tmpPath = NSTemporaryDirectory() println(tmpPath)
NSData
NSString與NSData互轉
NSString轉NSData
var conversionString = "is a string" conversionString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true) println(converedData) // 輸出:NSData(Optional):Optional(<69732061 20737472 696e67>)
NSData轉NSString
var converbackString = NSString(data: converedData!, encoding: NSUTF8StringEncoding) println(converbackString) // 輸出:NSString(Optional):Optional(is a string)
UIImage轉NSData
let image = documentDir + "/bg.jpg" let imageData: NSData = UIImageJPEGRepresentation(UIImage(named: image), 0.1)
從沙盒加載NSData類型的UIImage
// 加載NSData let imagetest = fileManager.contentsAtPath(imagePath) println(imagetest) // 顯示 let imageView = UIImageView(frame: view.bounds) imageView.image = UIImage(named: imagePath) view.addSubview(imageView)
NSFileManager文件管理
var fileManager = NSFileManager.defaultManager()
創建
文件夾
var documents = NSHomeDirectory() + "/Documents" var dirPath = documents + "/a/b/c" fileManager.createDirectoryAtPath(dirPath, withIntermediateDirectories: true, attributes: nil, error: nil) // 注:withIntermediateDirectories表示當創建的目錄完整路徑不滿足時,是否遞歸創建完整路徑
文件
// 存儲一個普通的文本文件 let stringContent = "Contnets of test" // 將文本內容轉換成NSData內容 let stringNSData = stringContent.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true) // 保存文本 fileManager.createFileAtPath(textPath, contents: stringNSData, attributes: nil)
讀取
遞歸遍歷指定目錄下所有內容
var recursivelyResult = fileManager.subpathsOfDirectoryAtPath(documents, error: nil) println(recursivelyResult)
遍歷指定目錄下內容
var contentResult = fileManager.contentsOfDirectoryAtPath(documents, error: nil) println(contentResult)
判斷一個文件或者文件夾是否存在
var aDir = documents + "/a" var exsit = fileManager.fileExistsAtPath(aDir) println(exsit)
獲取一個文件或目錄的屬性
var attributes = fileManager.attributesOfItemAtPath(aDir, error: nil) println(attributes)
設置文件或目錄屬性
Bool: fileManager.setAttributes(<#attributes: [NSObject : AnyObject]#>, ofItemAtPath: <#String#>, error: <#NSErrorPointer#>)
讀取文件內容
let content = fileManager.contentsAtPath(textPath) println(content)
移動(重命名)文件夾/文件
let newPath = documentDir + "/new.jpg" fileManager.moveItemAtPath(imagePath, toPath: newPath, error: nil)
刪除文件或文件夾
fileManager.removeItemAtPath(<#path: String#>, error: <#NSErrorPointer#>)
比較兩個文件內容是否相同
let result = fileManager.contentsEqualAtPath(image, andPath: imagePath)
讀權限
Bool: fileManager.isReadableFileAtPath(<#path: String#>)
寫權限
Bool: fileManager.isWritableFileAtPath(<#path: String#>)
NSString類路徑處理方法(工具方法)
NSString:pathWithComponens:components //根據components中的元素構造有效路徑 NSArray:pathComponents //析構路徑,獲得組成此路徑的各個部分 NSString:lastPathComponent //提取路徑的最后一個組成部分 NSString:pathExtension //從路徑的最后一個組成部分中提取其擴展名 NSString:stringByAppendingPathComponent:path //將path添加到現有路徑的末尾 NSString:stringByAppendingPathExtension:ext //將指定的擴展名添加到路徑的最后一個組成部分 NSString:stringByDeletingLastPathComponent //刪除路徑的最后一個組成部分 NSString:stringByDeletingPathExtension //從文件的最后一部分刪除擴展名 NSString:stringByExpandingTileInPath //將路徑中代字符擴展成用戶主目錄(~)或指定用戶的主目錄(~user) NSString:stringByresolvingSymlinksInPath //嘗試解析路徑中的符號鏈接 NSString:stringByStandardizingPath //通過嘗試解析~、..(父目錄符號)、.(當前目錄符號)和符號鏈接來標准化路徑
示例:
首先預定義一個文件路徑:
var filePath: NSString = "/Uesrs/anoxia/My love.mp3"
- 獲取組成路徑的各個部分:
println(filePath.pathComponents) // 輸出NSArray:[/, Uesrs, anoxia, My love.mp3]
- 活路路徑的最后一個組成部分:
println(filePath.lastPathComponent) // 輸出:NSString:My love.mp3
- 刪除路徑額的最后一個組成部分:
println(filePath.stringByDeletingLastPathComponent) // 輸出:NSString:/Uesrs/anoxia
- 在路徑最后添加路徑:
var appendPath = "file.txt" println(filePath.stringByAppendingPathComponent(anotherPath)) // 輸出:NSString:/Uesrs/anoxia/My love.mp3/text.a
- 獲取文件路徑的擴展:
println(filePath.pathExtension) // 輸出: NSString:mp3
- 在路徑最后面追加擴展名:
println(filePath.stringByAppendingPathExtension("a")) // 輸出:NSString(Optional):Optional("/Uesrs/anoxia/My love.mp3.a")
- 遍歷應用目錄
let filemanager: NSFileManager = NSFileManager() let files = filemanager.enumeratorAtPath(NSHomeDirectory()) while let file: AnyObject = files?.nextObject() { println(file) }