日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS - 沙盒文件操作指南

發布時間:2025/3/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS - 沙盒文件操作指南 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

最近在學習數據持久化相關的內容,文件作為 iOS 客戶端開發中一種常見的數據保存方式,自然也是應該學習的內容,本文就來簡單介紹文件相關的一些知識。

文章目錄

  • 前言
  • 1. 文件基礎
    • 沙盒路徑獲取
    • NSString 路徑操作
    • NSData 類型轉換
  • 2. NSFileManager 文件操作
    • 2.1 創建文件和目錄
    • 2.2 文件剪切和復制
    • 2.3 文件刪除
  • 3. NSFileHandle 文件讀寫
    • 3.1 常用方法
  • 參考資料

1. 文件基礎

在 iOS 系統中,所有非系統應用都經過了沙盒化,每個應用都擁有自己的沙盒(Sandbox)用于存儲本應用的文件數據,不同應用沙盒之間是相互獨立的,而且本應用不能訪問其他應用的沙盒。

沙盒機制保證了 iOS 應用的安全性,能有效防止 App 收集和篡改其他 App 存儲的信息。如果第三方 App 需要訪問除自身以外的其他信息,只能通過 iOS 系統明確提供的服務來實現。

應用沙盒的結構如下圖所示:

下面簡單介紹一下沙盒各個路徑的內容:

  • /Document 目錄:用于存放程序中的文件數據,應用程序在運行時生成一些需要長久保存的數據,如游戲進程存檔,為編輯完的文檔等。iTunes 、iCloud 對應用信息備份時,會備份這個目錄下的數據,因此會在此目錄保存相對重要的數據。
  • /Library 包含下面兩個子目錄
    • /Library/Caches 目錄 :恰如其名,該目錄用于存放緩存文件,從網絡上下載的文件或數據(如:音樂緩存、圖片緩存等)都會保存在該目錄下。該目錄下的文件不會在應用退出時手動刪除,需要程序員手動清除該目錄下的數據。iTunes 、iCloud 不會對該目錄下的數據進行備份。
    • /Library/Preferences 目錄:存放的是基于 NSUserDefaults 的設置數據,文件格式為 .plist。設置應用的一些功能會在該目錄中查找相應設置的信息,iTunes、iCloud備份時會備份此目錄下的數據。該目錄由系統自動管理,通常用來儲存一些基本的應用配置信息。
  • /Temp 目錄:存放應用運行時產生的一些臨時數據和文件,當應用程序退出、系統磁盤空間不足、手機重啟時,都會自動清除該目錄的數據。無需程序員手動清除該目錄中的數據,iTunes、iCloud備份時不會備份此目錄。

沙盒路徑獲取

我們可以通過下面的方法,獲取到上面提及到的沙盒目錄。

// 獲取沙盒根目錄 NSString *homeDir = NSHomeDirectory();// 獲取 /Document 目錄 NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];// 獲取 /Library 目錄 NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory , NSUserDomainMask , YES) lastObject];// 獲取 /Library/Caches 目錄 NSString *cacheDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];// 獲取 /Temp 目錄 NSString *tmpDir = NSTemporaryDirectory();

NSString 路徑操作

要想對文件進行操作,必然會涉及到文件路徑的處理。在 NSString 中,也給我們提供了路徑操作相關的 API。

/// 路徑分解,例如 /Users/Apple/file.txt 會得到 "/", "Users", "Apple", "file.txt" - (NSArray *)pathComponents;// 獲取路徑的最后部分,例如 /Users/Apple/file.txt 會得到 "file.txt" - (NSString *)lastPathComponent;// 在路徑末尾添加路徑,會自動處理 "/" - (NSString *)stringByAppendingPathConmponent:(NSString *)str;// 刪除路徑的最后部分,例如 /Users/Apple/file.txt 會得到 /Users/Apple/ - (NSString *)stringByDeletingLastPathCpmponent;// 為路徑添加拓展名,傳參的時候不用加 "." - (NSString *)stringByAppendingPathExtension:(NSString *)str;// 刪除路徑末尾的拓展名 - (NSString *)stringByDeletingPathExtension;

NSData 類型轉換

我們讀取文件時,通常獲取到的都是 NSData 類型的對象,下面是 NSData 到其他常用類型的相互轉換方法。

// NSString 和 NSData 互轉 NSString *str = @"Veggie"; NSData *strToData = [str dataUsingEncoding:NSUTF8StringEncoding]; NSString *dataToStr = [[NSString alloc] initWithData:strToData encoding:NSUTF8StringEncoding];// int 和 NSData 互轉 int i = 1024; NSData *intToData = [NSData dataWithBytes:&i length:sizeof(i)]; int dataToInt; [intToData getBytes:&dataToInt length:sizeof(dataToInt)];// UIImage 和 NSData 互轉 UIImage *image = [UIImage imageNamed:@"test"]; NSData *imageToData = UIImagePNGRepresentation(image); UIImage *dataToImage = [UIImage imageWithData:imageToData];// NSArray 和 NSData 互轉 NSArray *arr = @[@"1", @"2", @"3"]; NSData *arrToData = [NSJSONSerialization dataWithJSONObject:arr options:NSJSONWritingPrettyPrinted error:nil]; NSArray *dataToArr = [NSJSONSerialization JSONObjectWithData:arrToData options:NSJSONReadingMutableContainers error:nil];// NSDictionary 和 NSData 互轉 NSDictionary *dic = @{@"user_name" : @"veggie",@"user_age" : @"18" }; NSData *dicToData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil]; NSArray *dataToDic = [NSJSONSerialization JSONObjectWithData:dicToData options:NSJSONReadingMutableContainers error:nil];

2. NSFileManager 文件操作

我們想對沙盒中的目錄和文件進行操作時,可以用上系統為我們提供的 NSFileManager 文件管理類。下面就通過封裝方法的形式,簡單介紹 NSFileManager 的使用。

2.1 創建文件和目錄

創建目錄

- (BOOL)createDir:(NSString *)path {NSAssert(path > 0, @"%s: The length of path should be greater than 0.", __FUNCTION__);NSFileManager *fileManager = [NSFileManager defaultManager];BOOL isSuccess = YES;// 判斷目錄是否已經存在if (![fileManager fileExistsAtPath:path]) {// 創建文件目錄NSError *error = nil;isSuccess = [fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error];if (error) {NSLog(@"Create directory failed: %@",[error localizedDescription]);}}return isSuccess; }

創建文件,在創建之前需要確定文件的存儲路徑是存在的,如果不存在,則現在執行目錄創建操作。

- (BOOL)createFile:(NSString *)filePath {NSAssert(filePath > 0, @"%s: The length of filePath should be greater than 0.", __FUNCTION__);NSFileManager *fileManager = [NSFileManager defaultManager];// 提取出文件存放的目錄NSString *dir = [filePath stringByDeletingLastPathComponent];// 判斷目錄是否已經存在if (![fileManager fileExistsAtPath:dir]) {// 如果還沒有存在,則需要新建NSError *error = nil;[fileManager createDirectoryAtPath:dir withIntermediateDirectories:YES attributes:nil error:&error];if (error) {NSLog(@"Create directory failed: %@",[error localizedDescription]);return NO;}}// 創建文件return [fileManager createFileAtPath:filePath contents:nil attributes:nil]; }

2.2 文件剪切和復制

這里以一個簡單的任務來舉例,我們需要將 /Documents/from 目錄下的所有文件(文件名格式有規律)移動到 /Documents/to 目錄下,其目錄內容如下圖所示。

我們使用 NSFileManager 來實現,代碼如下:

NSString *fromPath = @"/Users/user_name/Documents/from"; NSString *toPath = @"/Users/user_name/Documents/to";NSFileManager *fileManager = [NSFileManager defaultManager];for (int i = 0; i < 100; i++) {NSString *fileName = [NSString stringWithFormat:@"veggie-%d.txt", i];// 注意:在 from 和 to 路徑上都要拼上文件名NSString *fileFromPath = [fromPath stringByAppendingPathComponent:fileName];NSString *fileToPath = [toPath stringByAppendingPathComponent:fileName];// 執行移動操作NSError *error = nil;BOOL isSuccess = [fileManager moveItemAtPath:fileFromPath toPath:fileToPath error:&error];if (isSuccess) {NSLog(@"moveFile Success!");} else {NSLog(@"moveFile Field:%@",[error localizedDescription]);} }

復制操作和上面的代碼非常詳細,用到的是下面這個 API,需要特別注意的是,參數中 srcPath 和 dstPath 路徑都要拼上文件名

- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;

2.3 文件刪除

- (BOOL)deleteFile:(NSString *)filePath {NSError *error = nil;NSFileManager *fileManager = [NSFileManager defaultManager];BOOL isSuccess = [fileManager removeItemAtPath:filePath error:&error];if (error) {NSLog(@"removeFile Field:%@",[error localizedDescription]);}return isSuccess; }

3. NSFileHandle 文件讀寫

NSFileHandle 主要用于對文件進行 I/O 操作,它的使用通常包括以下幾個步驟:

  • 打開文件,獲取文件對應的 NSFileHandle 對象
  • 對該文件執行 I/O 操作(讀取、寫入、插入)
  • 關閉文件

3.1 常用方法

// 打開一個文件,準備讀取 + (nullable instancetype)fileHandleForReadingAtPath:(NSString *)path; // 打開一個文件,準備寫入(會發生覆蓋) + (nullable instancetype)fileHandleForWritingAtPath:(NSString *)path; // 打開一個文件,準備插入內容 + (nullable instancetype)fileHandleForUpdatingAtPath:(NSString *)path;// 返回可用的數據 - (NSData *)availableData; // 從當前的節點讀取到文件的末尾 - (NSData *)readDataToEndOfFile; // 從當前節點開始讀取指定的長度數據 - (NSData *)readDataOfLength:(NSUInteger)length; // 寫入數據 - (void)writeData:(NSData *)data; // 獲取當前文件的偏移量 - (unsigned long long)offsetInFile; // 跳到指定文件的偏移量 - (void)seekToFileOffset:(unsigned long long)offset; // 跳到文件末尾 - (unsigned long long)seekToEndOfFile; // 將文件的長度設為offset字節 - (void)truncateFileAtOffset:(unsigned long long)offset; // 關閉文件 - (void)closeFile;

參考資料

  • File System Programming Guide | Apple Developer Documentation
  • NSFileManager | Apple Developer Documentation
  • NSString | Apple Developer Documentation
  • NSData | Apple Developer Documentation

好像又寫了一篇沒什么用的文章,希望后面在開發中用上了相關技術,可以再次回到這里更新自己的想法。

總結

以上是生活随笔為你收集整理的iOS - 沙盒文件操作指南的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。