沙盒(sandbox):iOS系統為每個應用程序創建自己的目錄,每個應用程序只能訪問自己的目錄。
所有的非代碼文件都要保存在此,例如圖像,圖標,聲音,映像,屬性列表,文本文件等。
在Mac的Finder上打開一個目錄
由于有些目錄比較長,不適合直接Finder里點擊選取。有兩種方法可以用:
在Finder的菜單中選擇 前往 > 前往文件夾
-
在命令行中使用
open
命令:open /Users/andyron/Library/Developer/CoreSimulator/Devices/F03C84B3-2A5E-44A7-AA51-2142A6397CA7/data/Containers/Data/Application/E83106A7-FCF3-45A6-888E-330BC52B279B/
應用沙盒的完整目錄
- Xcode的模擬器的目錄類似:
/Users/andyron/Library/Developer/CoreSimulator/Devices/F03C84B3-2A5E-44A7-AA51-2142A6397CA7/data/Containers/Data/Application/E83106A7-FCF3-45A6-888E-330BC52B279B/
Devices/F03C84B3-2A5E-44A7-AA51-2142A6397CA7
是Xcode中不同模擬器的區別字符
- 真機中類似:
/var/mobile/Containers/Data/Application/9AC577C1-08B2-4BAE-9CE2-1211E4994F9E/
類似Application/9AC577C1-08B2-4BAE-9CE2-1211E4994F9E/
這個目錄就是每個應用沙盒的根目錄。
沙盒中目錄結構類似如下:
├── Documents
├── Library
│ ├── Caches
│ │ └── Snapshots
│ │ └── com.andyron.Sandbox
│ │ ├── 9EEA412B-07C1-44EC-995B-0C12AD87BAF9@2x.ktx
│ │ └── D3F89052-27FD-42A1-B246-B416E1772FBB@2x.ktx
│ └── Preferences
├── SystemData
└── tmp
- 默認情況下,每個沙盒含有3個文件夾:Documents, Library 和 tmp。因為應用的沙盒機制,應用只能在幾個目錄下讀寫文件
-
Documents
:蘋果建議將程序中建立的或在程序中瀏覽到的文件數據保存在該目錄下,iTunes備份和恢復的時候會包括此目錄 -
Library
:存儲程序的默認設置或其它狀態信息; -
Library/Caches
:存放緩存文件,iTunes不會備份此目錄,此目錄下文件不會在應用退出刪除 -
tmp
:提供一個即時創建臨時文件的地方。 - iTunes在與iPhone同步時,備份所有的Documents和Library文件。
- iPhone在重啟時,會丟棄所有的tmp文件。
獲取不同目錄
// 1、獲取程序的Home目錄
NSString *homeDirectory = NSHomeDirectory();
NSLog(@"home path:%@", homeDirectory);
// 2、獲取document目錄
NSArray *Documentspaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *Documentspath = [Documentspaths objectAtIndex:0];
NSLog(@"Documents path:%@", Documentspath);
// 3、獲取Cache目錄 Library/Caches
NSArray *Cachepaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *Cachepath = [Cachepaths objectAtIndex:0];
NSLog(@"Cache path:%@", Cachepath);
// 4、獲取Library目錄
NSArray *Librarypaths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *Librarypath = [Librarypaths objectAtIndex:0];
NSLog(@"Library path:%@", Librarypath);
// 5、獲取Tmp目錄
NSString *tmpDir = NSTemporaryDirectory();
NSLog(@"tmpDir:%@", tmpDir);
文件的寫入和讀取
- (void)file_w {
// 6、寫入文件
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
if (!docDir) {
NSLog(@"Documents 目錄未找到");
}
NSArray *array = [[NSArray alloc] initWithObjects:@"內容",@"content",nil];
NSString *filePath = [docDir stringByAppendingPathComponent:@"testFile.txt"];
[array writeToFile:filePath atomically:YES];
}
- (void)file_r {
// 7, 讀取文件
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
NSString *filePath = [docDir stringByAppendingPathComponent:@"testFile.txt"];
NSArray *array = [[NSArray alloc]initWithContentsOfFile:filePath];
NSLog(@"%@", array);
}
文件管理
文件管理器NSFileManager
有判斷文件是否存在、創建目錄和文件、獲取文件名、刪除文件等功能。
- 判斷文件是否存在
// 創建文件管理器
NSFileManager * fileManager = [NSFileManager defaultManager];
NSString * documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString * filePath = [documents stringByAppendingPathComponent:@"testFile.txt"];
// 判斷一個文件是否存在,傳入全路徑
if ([fileManager fileExistsAtPath:filePath]) {
NSLog(@"it is exit");
}
- 創建目錄和文件
// 在Documents里創建目錄
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSLog(@"documentsDirectory: %@",documentsDirectory);
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *testDirectory = [documentsDirectory stringByAppendingPathComponent:@"test"];
// 創建目錄
[fileManager createDirectoryAtPath:testDirectory withIntermediateDirectories:YES attributes:nil error:nil];
// 在目錄下創建文件
NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test00.txt"];
NSString *testPath2 = [testDirectory stringByAppendingPathComponent:@"test22.txt"];
NSString *testPath3 = [testDirectory stringByAppendingPathComponent:@"test33.txt"];
NSString *string = @"寫入內容,write String";
[fileManager createFileAtPath:testPath contents:[string dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
[fileManager createFileAtPath:testPath2 contents:[string dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
[fileManager createFileAtPath:testPath3 contents:[string dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
- 獲取目錄列里所有文件名
subpathsOfDirectoryAtPath
和subpathsAtPath
兩個方法都可以。
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSLog(@"documentsDirectory: %@",documentsDirectory);
NSFileManager *fileManage = [NSFileManager defaultManager];
NSString *myDirectory = [documentsDirectory stringByAppendingPathComponent:@"test"];
NSArray *file = [fileManage subpathsOfDirectoryAtPath: myDirectory error:nil];
NSLog(@"%@",file);
NSArray *file2 = [fileManage subpathsAtPath: myDirectory ];
NSLog(@"%@",file2);
- 更改到指定目錄下操作
changeCurrentDirectoryPath
方法。
//創建文件管理器
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
//更改到待操作的目錄下
[fileManager changeCurrentDirectoryPath:[documentsDirectory stringByExpandingTildeInPath]];
//創建文件fileName文件名稱,contents文件的內容,如果開始沒有內容可以設置為nil,attributes文件的屬性,初始為nil
NSString * fileName = @"testFileNSFileManager.txt";
NSArray *array = [[NSArray alloc] initWithObjects:@"hello world",@"hello world1", @"hello world2",nil];
[fileManager createFileAtPath:fileName contents:[NSKeyedArchiver archivedDataWithRootObject:array] attributes:nil];
- 刪除文件
[fileManager removeItemAtPath:fileName error:nil];
代碼: Sandbox