FileManager 是 Foundation 框架中用來管理和操作文件爬范、目錄等文件系統(tǒng)相關(guān)聯(lián)內(nèi)容的類外厂。
1泽台、路徑操作
let nfManager =NSFileManager.defaultManager()
let folderUrl:NSURL=NSURL(string:NSHomeDirectory().stringByAppendingString("/Desktop/testFolder"))!
let filerUrl:NSURL=NSURL(string:NSHomeDirectory().stringByAppendingString("/Desktop/testFile.txt"))!
let srcUrl:NSURL=NSURL(string:NSHomeDirectory().stringByAppendingString("/Desktop/testFile.txt"))!
let dstUrl:NSURL=NSURL(string:NSHomeDirectory().stringByAppendingString("/Desktop/testFolder/testFile.txt"))!// 創(chuàng)建文件夾/*
public func createDirectoryAtPath(path: String,
withIntermediateDirectories createIntermediates: Bool,
attributes: [String : AnyObject]?) throws
path:文件夾路徑
createIntermediates:是否連同上一級(jí)路徑一起創(chuàng)建莽龟,NO 并且上一級(jí)文件路徑不存在時(shí)會(huì)創(chuàng)建失敗岁经。
attributes:文件夾屬性,nil 系統(tǒng)默認(rèn)屬性
*/try! nfManager.createDirectoryAtPath(folderUrl.path!, withIntermediateDirectories:true, attributes:nil)// 創(chuàng)建文件/*
func createFileAtPath(path: String,
contents data: NSData?,
attributes attr: [NSObject : AnyObject]?) -> Bool
path:文件路徑
data:文件內(nèi)容何荚,nil 空
attr:文件屬性囱淋,nil 系統(tǒng)默認(rèn)屬性
Bool:文件創(chuàng)建成功時(shí)返回值為 true
*/let bl1:Bool = nfManager.createFileAtPath(filerUrl.path!, contents:nil, attributes:nil)// 拷貝文件/*
如果 dstUrl 路徑文件已存在,該方法會(huì)終止拷貝餐塘,并返回 false妥衣。
如果 srcUrl 的最后一部分是符號(hào)鏈接,那么只有鏈接會(huì)被拷貝到新路徑戒傻。
*/try! nfManager.copyItemAtPath(srcUrl.path!, toPath: dstUrl.path!)// 刪除文件/*
刪除成功或者 url 為 nil 時(shí)返回 true税手,如果發(fā)生錯(cuò)誤返回 false。如果使用 delegate 終止了刪除文件的操作需纳,
則返回 true芦倒,如果使用 delegate 終止了刪除目錄的操作,則返回 false候齿。
*/try! nfManager.removeItemAtPath(dstUrl.path!)// 移動(dòng)文件/*
如果 dstUrl 路徑文件已存在熙暴,該方法會(huì)終止移動(dòng),并返回 false慌盯。如果 srcUrl 的最后一部分是符號(hào)鏈接周霉,
那么只有鏈接會(huì)被移動(dòng)到新路徑。鏈接所指向的內(nèi)容仍然保持在現(xiàn)有的位置亚皂。
*/try! nfManager.moveItemAtPath(srcUrl.path!, toPath: dstUrl.path!)// 查找滿足指定條件的路徑// 返回其 URL俱箱。該方法不但可以獲得標(biāo)準(zhǔn)系統(tǒng)目錄,還可以用來創(chuàng)建臨時(shí)路徑灭必。let url1:NSURL= try! nfManager.URLForDirectory(.DocumentDirectory,
inDomain: .UserDomainMask,
appropriateForURL:nil,
create:true)// 返回所有滿足條件的路徑列表let urlObjs:[NSURL] = nfManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
let url2:NSURL= urlObjs[0]// 查詢指定路徑下的所有子路徑let urls1:[String]? = nfManager.subpathsAtPath(url1.path!)
let urls2:[String] = try! nfManager.subpathsOfDirectoryAtPath(url1.path!)// 淺遍歷// 返回指定目錄下的文件狞谱、子目錄及符號(hào)鏈接的列表let contentsDir1:[String] = try! nfManager.contentsOfDirectoryAtPath(url1.path!)// 返回文件全路徑/*
public func contentsOfDirectoryAtURL(url: NSURL,
includingPropertiesForKeys keys: [String]?,
options mask: NSDirectoryEnumerationOptions) throws -> [NSURL]
返回指定目錄下的文件、子目錄及符號(hào)鏈接的列表禁漓,返回的是文件全路徑跟衅。
url:要進(jìn)行搜索的目錄路徑,該路徑不能為指向目標(biāo)目錄的符號(hào)鏈接播歼,如果是可以使用 URLByResolvingSymlinksInPath 進(jìn)行轉(zhuǎn)換伶跷。
keys:用來傳入進(jìn)行搜索的一些特定條件,包括創(chuàng)建時(shí)間秘狞,修改時(shí)間等叭莫。
mask:SkipsHiddenFiles:表示不遍歷隱藏文件,
SkipsSubdirectoryDescendants:表示不遞歸到子目錄內(nèi)部烁试,
SkipsPackageDescendants:表示不遞歸到包內(nèi)部雇初。
*/let contentsDir2:[NSURL] = try! nfManager.contentsOfDirectoryAtURL(url1,
includingPropertiesForKeys:nil,
options: .SkipsHiddenFiles)// 深遍歷// 返回指定目錄下的所有文件及其子目錄下的所有元素路徑let enumeratorDir1:NSDirectoryEnumerator= nfManager.enumeratorAtPath(url1.path!)!// 返回文件全路徑/*
func enumeratorAtURL(url: NSURL,
includingPropertiesForKeys keys: [AnyObject]?,
options mask: NSDirectoryEnumerationOptions,
errorHandler handler: ((NSURL!, NSError!) -> Bool)?) -> NSDirectoryEnumerator?
返回指定目錄下的所有文件及其子目錄下的所有元素路徑,返回的是文件全路徑减响。
url:要進(jìn)行搜索的目錄路徑靖诗,該路徑不能為指向目標(biāo)目錄的符號(hào)鏈接郭怪,如果是可以使用 URLByResolvingSymlinksInPath 進(jìn)行轉(zhuǎn)換。
keys:用來傳入進(jìn)行搜索的一些特定條件呻畸,包括創(chuàng)建時(shí)間移盆,修改時(shí)間等。
mask:SkipsHiddenFiles:表示不遍歷隱藏文件伤为,
SkipsSubdirectoryDescendants:表示不遞歸到子目錄內(nèi)部咒循,
SkipsPackageDescendants:表示不遞歸到包內(nèi)部。
*/let enumeratorDir2:NSDirectoryEnumerator= nfManager.enumeratorAtURL(url1,
includingPropertiesForKeys:nil,
options: .SkipsHiddenFiles,
errorHandler:nil)!// 枚舉遍歷深層遍歷let dEnu:NSDirectoryEnumerator? = nfManager.enumeratorAtPath(url1.path!)whilelet obj:AnyObject? = dEnu?.nextObject() {
print(obj)
}// 顯示路徑的本地化名稱/*
如果指定的文件或目錄不存在绞愚,會(huì)返回 path 本身叙甸。
*/let displayName:String = nfManager.displayNameAtPath(url1.path!)// 獲取指定路徑的各種屬性let attributes:[String:AnyObject] = try! nfManager.attributesOfItemAtPath(url1.path!)// 獲取指定路徑文件的內(nèi)容數(shù)據(jù)/*
如果指定路徑為目錄或發(fā)生錯(cuò)誤,返回 nil位衩。
*/let data:NSData? = nfManager.contentsAtPath(url1.path!.stringByAppendingString("/test.txt"))// 獲取當(dāng)前路徑let currentPath:String = nfManager.currentDirectoryPath// 更改當(dāng)前路徑/*
/Users/JHQ0228/Desktop/Debug
*/let bl6:Bool = nfManager.changeCurrentDirectoryPath(NSHomeDirectory().stringByAppendingString("/Desktop/Debug"))// 獲取臨時(shí)工作路徑/*
獲取系統(tǒng)中可以用來創(chuàng)建臨時(shí)文件的目錄路徑名裆蒸,一定要在完成任務(wù)之后將在其中創(chuàng)建的文件刪除。
*/let tempPath:NSString=NSTemporaryDirectory()// 獲取用戶主路徑(沙盒路徑)let homePath:NSString=NSHomeDirectory()// 獲取指定用戶的主路徑/*
NSUserName(); 獲取當(dāng)前用戶的登錄名糖驴。NSFullUserName(); 獲取當(dāng)前用戶完整用戶名
*/let userHomePath:String? =NSHomeDirectoryForUser(NSUserName())// 獲取用戶 Documents 路徑let documentPath:NSString=NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask,true)[0]// 獲取 app 包路徑let bundlePath =NSBundle.mainBundle().bundlePath// 創(chuàng)建一個(gè)新路徑try! nfManager.createDirectoryAtPath(NSHomeDirectory().stringByAppendingString("/Desktop/Debug1"),
withIntermediateDirectories:true, attributes:nil)// 獲取最后一個(gè)路徑let lastPath:String? =NSURL(string:NSHomeDirectory().stringByAppendingString("/Desktop"))?.lastPathComponent// 刪除最后一個(gè)路徑let deleteLastPath:String? =NSURL(string:NSHomeDirectory().stringByAppendingString("/Desktop"))?
.URLByDeletingLastPathComponent?
.path// 拼接一個(gè)路徑let appendingPath:String? =NSURL(string:NSHomeDirectory().stringByAppendingString("/Desktop"))?
.URLByAppendingPathComponent("testFolder")
.path// 文件路徑分割let pathArray:[String]? =NSURL(string:NSHomeDirectory().stringByAppendingString("/Desktop"))?.pathComponents// 文件路徑組合let pathString:NSString=NSString.pathWithComponents(pathArray!)// 將路徑中的代字符 ~ 擴(kuò)展成用戶主目錄或指定用戶的主目錄// 特殊的代字符 ~ 是用戶主目錄(如:/Users/JHQ0228)的縮寫僚祷,~linda 表示用戶 linda 主目錄的縮寫。let path1:NSString="~/Desktop/test.txt";// /Users/JHQ0228/Desktop/test.txtlet mainPath:String = path1.stringByExpandingTildeInPath// 解析路徑中的符號(hào)鏈接/*
/..? ? 上一級(jí)目錄
*/let path2:NSString="~/../Debug"let appPath1:String = path2.stringByResolvingSymlinksInPath// 通過解析 ~(用戶主目錄)贮缕、..(父目錄) 辙谜、.(當(dāng)前目錄)和符號(hào)鏈接來標(biāo)準(zhǔn)化路徑/*
NSHomeDirectory()/..? ? NSHomeDirectory() 的上一級(jí)目錄
*/let path3:NSString=NSString(format:"%@/../Debug",NSHomeDirectory())
let appPath2:String = path3.stringByStandardizingPath// 獲取文件拓展名let getExtension:String? =NSURL(string:"/Desktop/test.txt")?.pathExtension// 刪除文件拓展名let deleteExtension:String? =NSURL(string:"/Desktop/test.txt")?.URLByDeletingPathExtension?.pathExtension// 拼接文件拓展名let appendingExtension:String? =NSURL(string:"/Desktop/test.txt")?.URLByAppendingPathExtension("doc").path
2、路徑判斷
let nfManager =NSFileManager.defaultManager()
let url1:NSURL= try! nfManager.URLForDirectory(.DocumentDirectory,
inDomain: .UserDomainMask,
appropriateForURL:nil,
create:true)// 判斷路徑是否存在/*
如果當(dāng)前路徑以~開頭感昼,需使用 NSString 的 stringByExpandingTildeInPath 方法進(jìn)行處理装哆,否則會(huì)返回 false
*/let bl1:Bool = nfManager.fileExistsAtPath(url1.path!)// 判斷指定路徑是否有可讀權(quán)限let bl2:Bool = nfManager.isReadableFileAtPath(url1.path!)// 判斷指定路徑是否有可寫權(quán)限let bl3:Bool = nfManager.isWritableFileAtPath(url1.path!)// 判斷指定路徑是否有可執(zhí)行權(quán)限let bl4:Bool = nfManager.isExecutableFileAtPath(url1.path!)// 判斷指定路徑是否有可刪除權(quán)限let bl5:Bool = nfManager.isDeletableFileAtPath(url1.path!)// 判斷兩個(gè)指定路徑的內(nèi)容是否相同let bl6:Bool = nfManager.contentsEqualAtPath(url1.path!,
andPath: url1.path!.stringByAppendingString("/test.txt"))
3、文件操作
let fileUrl:NSURL=NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,
inDomains: .UserDomainMask)[0]
as!NSURL// 文件打開// 讀寫var nfHandle =NSFileHandle(forUpdatingAtPath: fileUrl.path!.stringByAppendingString("/test.txt"))!// 只讀var nfHandle1 =NSFileHandle(forReadingAtPath: fileUrl.path!.stringByAppendingString("/test.txt"))!// 只寫var nfHandle2 =NSFileHandle(forWritingAtPath: fileUrl.path!.stringByAppendingString("/test.txt"))!// 文件句柄偏移量// 獲取文件句柄指針的偏移量let offSetNum1:UInt64= nfHandle.offsetInFile// 將偏移量移到文件末尾定嗓,返回移動(dòng)后的指針偏移量let offSetNum2:UInt64= nfHandle.seekToEndOfFile()// 將偏移量指向特定的位置nfHandle.seekToFileOffset(0)// 文件讀取// 獲取當(dāng)前文件句柄的可用數(shù)據(jù)蜕琴,獲取后指針移到文件末尾let availableData:NSData= nfHandle.availableData// 獲取從當(dāng)前指針位置到文件結(jié)束的所有數(shù)據(jù),獲取后指針移到文件末尾let data1:NSData= nfHandle.readDataToEndOfFile()// 獲取從當(dāng)前指針位置開始讀取的 length 長度的數(shù)據(jù)內(nèi)容宵溅,獲取后指針移到文件讀取到的位置let data2:NSData= nfHandle.readDataOfLength(10)// 文件寫入// 從當(dāng)前指針位置寫入數(shù)據(jù)到文件nfHandle.writeData("你好".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion:true)!)// 文件關(guān)閉// 關(guān)閉文件nfHandle.closeFile()// 文件比較let nfManager =NSFileManager.defaultManager()// 文件路徑let filePath1:String =NSHomeDirectory().stringByAppendingString("/Desktop/file1.txt")
let filePath2:String =NSHomeDirectory().stringByAppendingString("/Desktop/file2.txt")
nfManager.createFileAtPath(filePath1,
contents:"北京歡迎您".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion:true),
attributes:nil)
nfManager.createFileAtPath(filePath2,
contents:"北京歡迎".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion:true),
attributes:nil)// 比較兩個(gè)文件的內(nèi)容是否相等let bl:Bool = nfManager.contentsEqualAtPath(filePath1, andPath: filePath2)