Swift\本地文件管理


轉載自: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) } 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM