原文連結: http://www.jianshu.com/p/349855b5a8ae iOS APP 可以在自己的沙盒裡讀寫檔案,但是,不可以通路其他 APP 的沙盒。每一個 APP 都是一個資訊孤島,互相是不可以進行通信的,唯獨可以通過 URL Scheme。沙盒裡面的檔案可以是照片、聲音檔案、文本、屬性清單等。 —— 由 膜法小編分享
沙盒機制
iOS APP可以在自己的沙盒裡讀寫檔案,但是,不可以通路其他APP的沙盒。每一個APP都是一個資訊孤島,互相是不可以進行通信的,唯獨可以通過
URL Scheme
。沙盒裡面的檔案可以是照片、聲音檔案、文本、屬性清單等。
沙河盒根目錄的結構
- Documents:用于存儲使用者資料,iTunes備份和恢複的時候會包含此目錄。是以,蘋果建議将程式中建立的或在程式中浏覽到的資料儲存在該目錄下
- Library
- Caches :Caches用來存放使用者需要換成的檔案
- Preferences :Preferences是APP的偏好設定,可以通過NSUserDefaults來讀取和設定
- tmp:用于存放臨時檔案,這個可以放一些當APP退出後不再需要的檔案。
62317-e49c692cb5d9ebb3.png
路徑擷取
1、擷取沙盒根目錄
NSString *directory = NSHomeDirectory();
NSLog(@"directory:%@", directory);
列印結果
2、擷取Documents路徑
參數的意義:
21BD09BC-4F15-4FDD-AF3E-A5D3FA2EF2BB.png
/*
第一個參數:指定了搜尋的路徑的名稱:NSDocumentDirectory 表示是在Documents中尋找。NSCacheDirectory的話就是在cache檔案中尋找
第二個參數:第二個參數限定了檔案的檢索範圍隻在沙箱内部.其意義為使用者電腦主目錄.也可以修改為網絡主機等
第三個參數:最後一個參數決定了是否展開波浪線符号.展開後才是完整路徑,這個布爾值一直為YES.
*/
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSLog(@"paths.count:%ld",paths.count);
for (NSInteger i = ; i < paths.count; i++) {
NSString *path = paths[i];
NSLog(@"path:%@",path);
}
列印結果:
0C469A95-2A42-41C4-AA77-2EB6D97917E2.png
列印的路徑
3、擷取Library路徑
//擷取Library路徑
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:];
NSLog(@"path:%@", path);
列印結果
4、擷取Caches路徑
//擷取Caches路徑
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:];
NSLog(@"path:%@", path);
列印結果
5、擷取tmp路徑
NSString *tmp = NSTemporaryDirectory();
NSLog(@"tmp:%@", tmp);
列印結果
打開沙盒方法
finder前往
螢幕快照 2017-04-12 上午11.11.28.png
直接在Finder->前往->前往檔案夾,輸入上面的内容即可
檔案操作
NSFileManager:NSFileManager是用來管理檔案系統的,它可以用來進行常見的檔案\檔案夾操作(拷貝、剪切、建立等)
NSFileManager使用了單例模式singleton
使用defaultManager方法可以獲得那個單例對象
[NSFileManager defaultManager]
檔案的增删改查
1、建立檔案夾
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:];
//建立檔案夾的路徑
NSString *testPath = [documentsPath stringByAppendingPathComponent:@"test"];
//建立目錄
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL rest = [fileManager createDirectoryAtPath:testPath withIntermediateDirectories:YES attributes:nil error:nil];
if (rest) {
NSLog(@"檔案夾建立成功:%@",testPath);
}else{
NSLog(@"檔案夾建立失敗");
}
列印結果
檔案夾建立成功:/Users/jiangjunuhi/Library/Developer/CoreSimulator/Devices/C61-E6B--A-CA75FDC83/data/Containers/Data/Application/FC2F96A3-A5A6-BC9-A551-F9F247F9D/Documents/test
2、建立檔案
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:];
NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"];
BOOL res=[fileManager createFileAtPath:testPath contents:nil attributes:nil];
if (res) {
NSLog(@"檔案建立成功: %@" ,testPath);
}else{
NSLog(@"檔案建立失敗");
}
列印結果
3、寫資料到檔案
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:];
NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];
NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"];
NSString *content=@"測試寫入内容!";
BOOL res=[content writeToFile:testPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
if (res) {
NSLog(@"檔案寫入成功:%@",testPath);
}else
NSLog(@"檔案寫入失敗");
4、讀檔案資料
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:];
NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];
NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"];
// NSData *data = [NSData dataWithContentsOfFile:testPath];
// NSLog(@"檔案讀取成功: %@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
NSString *content=[NSString stringWithContentsOfFile:testPath encoding:NSUTF8StringEncoding error:nil];
NSLog(@"檔案讀取成功: %@",content);
5、删除檔案
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"];
BOOL res=[fileManager removeItemAtPath:testPath error:nil];
if (res) {
NSLog(@"檔案删除成功");
}else
NSLog(@"檔案删除失敗");
NSLog(@"檔案是否存在: %@",[fileManager isExecutableFileAtPath:testPath]?@"YES":@"NO");
}
2、檔案的一些常用方法
1、判斷檔案是否存在
//建立檔案管理對象
//調用defaultManager 建立一個檔案管理的單例對象
//單例對象:在程式運作期間,隻有一個對象存在
NSFileManager *fm = [NSFileManager defaultManager];
// YES 存在 NO 不存在
BOOL isYES = [fm fileExistsAtPath:filePath];
NSLog(@"-->%d",isYES);
2、判斷是否是一個目錄
if(isYES){
BOOL isDir;
// 2) 判斷是否是一個目錄
[fm fileExistsAtPath:filePath isDirectory:&isDir];
if (isDir) {
NSLog(@"這是一個目錄");
}else{
NSLog(@"這不是一個目錄");
}
}
3、判斷檔案是否可讀 4、是否可寫 5、是否可删除 6、擷取檔案的資訊(屬性)
//建立檔案對象
NSFileManager *fm = [NSFileManager defaultManager];
NSString *filePath = @"/Users/zhaoxiaohu/Desktop/arr.plist";
NSString *dirPath = @"/Users/zhaoxiaohu/Desktop/a";
//1)如何擷取檔案的資訊(屬性)
NSDictionary *dict = [fm attributesOfItemAtPath:filePath error:nil];
NSLog(@"%@",dict);
NSLog(@"%@,%@",[dict objectForKey:@"NSFileOwnerAccountName"],dict[@"NSFileOwnerAccountName"]);
7、copy檔案
//如何copy檔案
NSString *targetPath = @"/Users/zhaoxiaohu/Desktop/aaa/ccc/love.txt";
[fm copyItemAtPath:createDirPath toPath:targetPath error:nil];
NSString *targetPath = @"/Users/zhaoxiaohu/Desktop/aaa/love.txt";
8、移動檔案
[fm moveItemAtPath:createDirPath toPath:targetPath error:nil];