首先,如果你的文件是應(yīng)用運行的一部分忘衍,圖片,聲音資源等卿城,就放在應(yīng)用的Bundle里枚钓,它將成為應(yīng)用代碼簽名的一部分,對它的移動和修改都會造成應(yīng)用無法啟動瑟押,這里并不是儲存用戶文檔的好地方搀捷。在OSX上,這樣的資源文件被復(fù)制到Resuorces文件夾中多望,在IOS上則放在根目錄下嫩舟。
NSFileManager
//這里獲取的是共享的文件管理器對象
var fileManager = NSFileManager.defaultManager()
//如果你想對文件進行像復(fù)制或移動之類的操作時,在這樣的操作完成時NSFilerManager會給其代理發(fā)送一個消息怀偷,這時就不能用共享對象了家厌,而是要建立一個自己的對象
fileManager = NSFileManager()
//將自己設(shè)置為代理,當(dāng)操作完成時獲得提示
fileManager.delegate = self
let DesktopURL = "/Users/exialym/Desktop/"
let folderURL = NSURL.fileURLWithPath(DesktopURL)
//這個方法返回文件夾內(nèi)所有文件的NSURL
let folderContents = try? fileManager.contentsOfDirectoryAtURL(folderURL, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions())
//如果你要獲取大量文件的屬性椎工,你可以在contentOfDirectoryAtURL的includingPropertiesForKeys參數(shù)里傳入要查的屬性的鍵
if (folderContents != nil) {
for file in folderContents! {
//要獲取的屬性的值
let attr = [NSURLFileSizeKey,NSURLContentModificationDateKey]
//NSURL有這么個獲取各種屬性的方法
let attrDic = try? file.resourceValuesForKeys(attr)
if (attrDic != nil) {
let fileSize = (attrDic![NSURLFileSizeKey]) as? NSNumber
let fileLastDate = attrDic![NSURLContentModificationDateKey] as? NSDate
print("\(file):\(fileSize)+\(fileLastDate)")
}
}
}
有時需要臨時儲存一些文件
//如果你要臨時儲存什么文件可以申請一個臨時目錄饭于,這個目錄在系統(tǒng)認為磁盤空間不夠時會被自動清除,所以要小心
let temporaryDirectoryPath = NSTemporaryDirectory()
let temporaryDirectoryURL = NSURL(fileURLWithPath: temporaryDirectoryPath)
//這里返回給你的是一個可以在其中儲存文件的臨時目錄维蒙,最好在里面新建個文件夾再存東西
print(temporaryDirectoryURL)
文件操作
//創(chuàng)建新目錄
let newDirectoryURL = NSURL.fileURLWithPath(DesktopURL + "/newFile/a/b")
//withIntermediateDirectories為true時就可以創(chuàng)建新文件夾和它的子文件夾
let didCreate = try? fileManager.createDirectoryAtURL(newDirectoryURL, withIntermediateDirectories: true, attributes: nil)
didCreate != nil ? print("Dir:success") : print("Dir:failed")
//創(chuàng)建文件掰吕,路徑里記得包含文件名
let myData = NSData(contentsOfURL: NSURL(string: "http://www.feng.com/favicon.ico")!)
fileManager.createFileAtPath(DesktopURL + "/newFile/a/aa", contents: myData, attributes: nil)
//復(fù)制
_ = try? fileManager.copyItemAtPath(DesktopURL + "/newFile/a/aa", toPath: DesktopURL + "/newFile/a/b/aa")
//移動
_ = try? fileManager.moveItemAtPath(DesktopURL + "/newFile/a/b/aa", toPath: DesktopURL + "/newFile/aa")
//刪除文件,直接刪除木西,不是放入廢紙簍
_ = try? fileManager.removeItemAtPath(DesktopURL + "/newFile/a/aa")
自動獲取一些特定的目錄
//有一些常用目錄用來存儲文件畴栖,比如文檔,桌面等八千,還有Caches吗讶。我們可以通過這個方法來獲取這些文件夾的路徑這個方法返回一個URL的數(shù)組
//比如你想獲取桌面的路徑,這樣獲取路徑在開啟和不開啟沙盒的情況下是不同的
//不開啟時你獲取到的是正常的:file:///Users/exialym/Desktop/
//開啟時獲取的就是:
//file:///Users/exialym/Library/Containers/edu.bupt.exialym.VideoPlayer/Data/Desktop/
let urls = fileManager.URLsForDirectory(NSSearchPathDirectory.DesktopDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask)
print(urls)
沙盒
IOS強制沙盒恋捆,OSX可選照皆。
在沙盒模式下,應(yīng)用訪問任何包外的文件都需要授權(quán)沸停,可以在Capabilities中配置一些常用的權(quán)限膜毁,設(shè)置是否可以訪問音樂,下載等文件夾。有一個比較特殊的叫User Selected File Access瘟滨,可以配置讓用戶選擇可以訪問的文件候醒。
用戶使用NSOpenPanel和NSSavePanel。它們是標(biāo)準(zhǔn)的打開和保存窗口杂瘸。在應(yīng)用放在沙盒以后倒淫,這兩個面板由PowerBox而非你的應(yīng)用顯示。
let panel = NSOpenPanel()
panel.canChooseDirectories = true
panel.canChooseFiles = true
panel.beginWithCompletionHandler { (result:Int) -> Void in
self.playerView.player = AVPlayer(URL: panel.URL!)
}