簡介
iOS 應(yīng)用程序在安裝時,會創(chuàng)建屬于自己的沙盒文件(standbox)。應(yīng)用程序中所有的非代碼文件都保存在沙盒中,如圖片、聲音、屬性列表,sqlite數(shù)據(jù)庫和文本文件等。
在沙盒機制下,每個應(yīng)用程序之間的文件夾不能互相訪問。iOS系統(tǒng)為了保證系統(tǒng)安全,采用了這種機制。
其原理是通過重定向技術(shù),把應(yīng)用程序生成和修改的文件,定向到自身文件夾中。
沙盒目錄組成
沙盒的的根目錄有三個文件夾:Documents,Library,tmp


子目錄有Caches、Preferences等文件夾,其中 Documents 和 Preferences 會被 iCloud 同步。
值得注意的是,NSUserDefaults是存儲在 Preferences 下的文件,發(fā)現(xiàn)有很多開發(fā)者為了偷懶,頻繁的使用NSUserDefaults做任意數(shù)據(jù)的磁盤緩存。
這是一個很不合理的做法,用處不大。且大量的數(shù)據(jù)一般緩存在 Caches 中。就算是從技術(shù)角度考慮,NSUserDefaults是以 .plist 形式存儲的,不適合大數(shù)據(jù)存儲。
查找文件路徑
NSSearchPathForDirectoriesInDomains()是用來查找文件路徑的函數(shù)。
返回值:是一個數(shù)組,其中只有一個NSString元素,即查找的路徑。
參數(shù)1:NSDocumentDirectory表示需要查找的目錄
參數(shù)2:NSUserDomainMask表示在用戶的主目錄中查找
參數(shù)3:YES表示返回路徑展開
- 沙盒根目錄的路徑
通過NSHomeDirectory()獲取沙盒路徑。
NSString *path = NSHomeDirectory();
NSLog(@"%@", path);
- 獲取Documents目錄的路徑
參數(shù)1是NSDocumentDirectory
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
- 獲取Library目錄的路徑
參數(shù)1是NSLibraryDirectory
NSString *path = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).lastObject;
- 獲取Caches目錄的路徑
參數(shù)1是NSCachesDirectory
NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
此目錄用來保存應(yīng)用程序運行時,生成的需要持久化的數(shù)據(jù),這些數(shù)據(jù)一般存儲體積較大,又不十分重要,如網(wǎng)絡(luò)請求數(shù)據(jù)等。需要用戶負責刪除。
- 獲取Preferences目錄的路徑
NSString *path = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"Preferences"];
此目錄保存應(yīng)用程序的所有偏好設(shè)置,iOS的Settings(設(shè)置)應(yīng)用會在該目錄中查找應(yīng)用的設(shè)置信息。
- 獲取tmp文件路徑
NSString *path = NSTemporaryDirectory();
此目錄保存應(yīng)用程序運行時,所需的臨時數(shù)據(jù),使用完畢后再將相應(yīng)的文件從該目錄刪除。應(yīng)用沒有運行時,系統(tǒng)也可能會清除該目錄下的文件。
保存圖片到沙盒
UIImage *currentImage = photos[i];
NSData *imageData = UIImageJPEGRepresentation(currentImage, 0.5);
// 獲取沙盒路徑
NSString *fullPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:[NSString stringWithFormat:@"%zd.png",i]];
// 寫入
[imageData writeToFile:fullPath atomically:YES];
從沙盒讀取圖片
// 讀取圖片
NSString * fullPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Docments"] stringByAppendingPathComponent:@"currentImage.png"];
UIImage * savedImage = [[UIImage alloc] initWithContentsOfFile:fullPath];
刪除沙盒文件
-(void)deleteFile {
NSFileManager * fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
//文件名
NSString *uniquePath=[[paths objectAtIndex:0] stringByAppendingPathComponent:@"pin.png"];
BOOL isExit =[[NSFileManager defaultManager] fileExistsAtPath:uniquePath];
if (! isExit) {
NSLog(@"not exit !");
return ;
}else {
BOOL isDele= [fileManager removeItemAtPath:uniquePath error:nil];
if (isDele)
NSLog(@"delete success");
}
}
得到沙盒中的所有文件
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *document=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *folder =[document stringByAppendingPathComponent:@"folder"];
NSArray *fileList ;
fileList =[fileManager contentsOfDirectoryAtPath:folder error:NULL];
for (NSString *file in fileList) {
NSLog(@"file=%@",file);
NSString *path =[folder stringByAppendingPathComponent:file];
NSLog(@"得到的路徑=%@",path);
}
計算文件大小
- (long long)fileSizeAtPath:(NSString *)path
{
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:path])
{
long long size = [fileManager attributesOfItemAtPath:path error:nil].fileSize;
return size;
}
return 0;
}
文件夾大小
- (long long)folderSizeAtPath:(NSString *)path
{
NSFileManager *fileManager = [NSFileManager defaultManager];
long long folderSize = 0;
if ([fileManager fileExistsAtPath:path])
{
NSArray *childerFiles = [fileManager subpathsAtPath:path];
for (NSString *fileName in childerFiles)
{
NSString *fileAbsolutePath = [path stringByAppendingPathComponent:fileName];
if ([fileManager fileExistsAtPath:fileAbsolutePath])
{
long long size = [fileManager attributesOfItemAtPath:fileAbsolutePath error:nil].fileSize;
folderSize += size;
}
}
}
return folderSize;
}
相關(guān)資料
http://www.itdecent.cn/p/0913b8b6c858
http://www.itdecent.cn/p/0dbe875d7723
http://www.itdecent.cn/p/dd3f120eb249