`
zhengjj_2009
  • 浏览: 153260 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

09-iOS沙盒(SandBox)机制和文件操作、NSFileManager

 
阅读更多

1、iOS沙盒机制

 iOS应用程序只能在为该改程序创建的文件系统内读取文件,不能去其它地方访问,此区域被成为沙盒,因此所有的非代码文件都要保存在这个沙盒里面,例如图像,图标,声音,映像,属性列表,文本文件等。

 1.1、每个应用程序都有自己的存储空间
 1.2、应用程序不能翻过自己的围墙去访问别的存储空间的内容
 1.3、应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。
     可以简单理解为SandBox是一种安全体系,应用程序的所有操作都要通过这个体系来执行,其中核心内容是:sandbox对应用程序执行各种操作的权限限制。

2、打开模拟器沙盒目录

下面看看模拟器的沙盒文件夹在mac电脑上的什么位置。

文件都在个人用户名文件夹下的一个隐藏文件夹里,中文叫资源库,他的目录其实是Library。

2.1 方法1、可以设置显示隐藏文件,然后在Finder下直接打开。设置查看隐藏文件的方法如下:打开终端,输入命名

 

显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true

隐藏Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false

输完单击Enter键,退出终端,重新启动Finder就可以了
重启Finder:鼠标单击窗口左上角的苹果标志-->强制退出-->Finder-->

现在能看到资源库文件夹了。

 

打开资源库后找到/Application Support/iPhone Simulator/文件夹。这里面就是模拟器的各个程序的沙盒目录了。

2.2 方法2、这种方法更方便,在Finder上点->前往->前往文件夹,输入/Users/username/Library/Application Support/iPhone Simulator/  前往。

username这里写你的用户名。

3、目录结构

默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。因为应用的沙盒机制,应用只能在几个目录下读写文件
Documents:苹果建议将在程序中生成的或在程序中浏览到的文件数据保存在该目录下iTunes备份和恢复的时候会包括此目录
Library:存储程序的默认设置或其它状态信息;

Library/Caches存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除

tmp:提供一个即时创建临时文件的地方。

 

iTunes在与iPhone同步时,备份所有的Documents和Library文件。

iPhone在重启时,会丢弃所有的tmp文件。

 

我们创建一个IosSandbox的项目来展开沙盒和文件读写等操作的练习。

创建后找到模拟器上对应的目录,

--------------------------------------------------------------------------------------------------------

 

1、获取程序的Home目录

 

        NSString *homeDirectory = NSHomeDirectory();  
         NSLog(@"path:%@", homeDirectory);  
    NSString *homeDirectory = NSHomeDirectory();
    NSLog(@"path:%@", homeDirectory);

 

打印结果:

2012-06-17 14:00:06.098 IosSandbox[3536:f803] /Users/rongfzh/Library/Application Support/iPhone Simulator/5.1/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2  
2012-06-17 14:00:06.098 IosSandbox[3536:f803] /Users/rongfzh/Library/Application Support/iPhone Simulator/5.1/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2

那在真机上的目录有是怎么样的呢?我们看看

2012-06-17 14:25:47.059 IosSandbox[4281:f803] /var/mobile/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2

可见,真机上的目录是/var/mobile/Applications/这个目录下的,和模拟器不一样。这个是Home目录,其他的子目录和模拟器一样。

 

2、获取document目录

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
NSString *path = [paths objectAtIndex:0];  

NSLog(@"path:%@", path);  

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path = [paths objectAtIndex:0];
    NSLog(@"path:%@", path);

打印结果

 

 

2012-06-17 14:00:06.099 IosSandbox[3536:f803] path:/Users/rongfzh/Library/Application Support/iPhone Simulator/5.1/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2/Documents  
2012-06-17 14:00:06.099 IosSandbox[3536:f803] path:/Users/rongfzh/Library/Application Support/iPhone Simulator/5.1/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2/Documents

3、获取Cache目录

 

 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);  

NSString *path = [paths objectAtIndex:0];  

NSLog(@"%@", path);  

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *path = [paths objectAtIndex:0];
    NSLog(@"%@", path);

打印结果

2012-06-17 14:03:50.431 IosSandbox[3628:f803] /Users/rongfzh/Library/Application Support/iPhone Simulator/5.1/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2/Library/Caches  
2012-06-17 14:03:50.431 IosSandbox[3628:f803] /Users/rongfzh/Library/Application Support/iPhone Simulator/5.1/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2/Library/Caches


4、获取Library目录

 

 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);  

NSString *path = [paths objectAtIndex:0];  

NSLog(@"%@", path);  

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    NSString *path = [paths objectAtIndex:0];
    NSLog(@"%@", path);

打印结果

2012-06-17 14:07:17.544 IosSandbox[3733:f803] /Users/rongfzh/Library/Application Support/iPhone Simulator/5.1/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2/Library  
2012-06-17 14:07:17.544 IosSandbox[3733:f803] /Users/rongfzh/Library/Application Support/iPhone Simulator/5.1/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2/Library

5、获取Tmp目录

NSString *tmpDir = NSTemporaryDirectory();  

 NSLog(@"%@", tmpDir);  

   NSString *tmpDir = NSTemporaryDirectory();
    NSLog(@"%@", tmpDir);

打印结果

 

 

2012-06-17 14:08:07.824 IosSandbox[3782:f803] /var/folders/g7/246bh79130zblw0yjjtc55cw0000gn/T/  
2012-06-17 14:08:07.824 IosSandbox[3782:f803] /var/folders/g7/246bh79130zblw0yjjtc55cw0000gn/T/

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];  

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];

 

注:我们在真机上也运行一下,把文件写入,下一步从真机上把内容读取出来。

写入输入 array ,里面是两个字符串,一会我们读出来打印。

写入我们在程序沙盒目录下看到文件 testFile.txt

 

打开文件看到的内容是这样的,是个xml格式的plist文件,数据格式保存了内容。

 

<?xml version="1.0" encoding="UTF-8"?>  

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">  

<plist version="1.0">  

<array>  

    <string>内容</string>  

    <string>content</string>  

</array>  

</plist>  

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
	<string>内容</string>
	<string>content</string>
</array>
</plist>

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);  

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);

打印结果:

 

把上面的文件解析后,把内容打印出来了。

 

2012-06-17 14:14:46.249 IosSandbox[3918:f803] (  

    "\U5185\U5bb9",  

    content  

)  

2012-06-17 14:14:46.249 IosSandbox[3918:f803] (
    "\U5185\U5bb9",
    content
)

 

真机上读取并打印文件路径:

 

2012-06-17 14:25:47.059 IosSandbox[4281:f803] /var/mobile/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2/Documents/testFile.txt

 (

 

    "\U5185\U5bb9",

    content

)

真机上也能写入和打印。

------------------------------------------------------------------------------------------------------------

我们看看NSFileManager如何使用。包括创建文件,目录,删除,遍历目录等。

 

1、在Documents里创建目录

创建一个叫test的目录,先找到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];

 

启动程序,这时候目录就创建了:

 

2、在test目录下创建文件

创建文件怎么办呢?接着上面的代码 testPath 要用stringByAppendingPathComponent拼接上你要生成的文件名,比如test00.txt。这样才能在test下写入文件。

 

testDirectory是上面代码生成的路径哦,不要忘了。我往test文件夹里写入三个文件,test00.txt ,test22.txt,text.33.txt。内容都是写入内容,write String。

实现代码如下:

    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];

看下面的图,三个文件都出来了,内容也对。

 

在Documents目录下创建就更简单了,不用加test就ok了

3、获取目录列里所有文件名

两种方法获取: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 *files = [fileManage subpathsAtPath: myDirectory ]; 
    NSLog(@"%@",files);

获取上面刚才test文件夹里的文件名

打印结果

 

2012-06-17 23:23:19.684 IosSandbox[947:f803] fileList:(

    ".DS_Store",

    "test00.txt",

    "test22.txt",

    "test33.txt"

)

2012-06-17 23:23:19.686 IosSandbox[947:f803] fileLit(

    ".DS_Store",

    "test00.txt",

    "test22.txt",

    "test33.txt"

)

两个方法都可以,隐藏的文件也打印出来了。

4、fileManager使用操作当前目录

//创建文件管理器
    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:array attributes:nil];

这样就创建了testFileNSFileManager.txt并把三个hello world写入文件了

 

 

changeCurrentDirectoryPath目录更改到当前操作目录时,做文件读写就很方便了,不用加上全路径

5、删除文件

接上面的代码,remove就ok了。

    [fileManager removeItemAtPath:fileName error:nil];

6、混合数据的读写

 

用NSMutableData创建混合数据,然后写到文件里。并按数据的类型把数据读出来

6.1写入数据:

    NSString * fileName = @"testFileNSFileManager.txt";
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    //获取文件路径
    NSString *path = [documentsDirectory stringByAppendingPathComponent:fileName];
    //待写入的数据
    NSString *temp = @"nihao 世界";
    int dataInt = 1234;
    float dataFloat = 3.14f;
    //创建数据缓冲
    NSMutableData *writer = [[NSMutableData alloc] init];
    //将字符串添加到缓冲中
    [writer appendData:[temp dataUsingEncoding:NSUTF8StringEncoding]];   
    //将其他数据添加到缓冲中
    [writer appendBytes:&dataInt length:sizeof(dataInt)];
    [writer appendBytes:&dataFloat length:sizeof(dataFloat)];  
    //将缓冲的数据写入到文件中
    [writer writeToFile:path atomically:YES];


我们看看数据怎么样了:

 


我们看到后面的是乱码,那是中文被转成了NSData后,还有int float的二进制

6.2读取刚才写入的数据:  

 //读取数据:
    int intData;
    float floatData = 0.0;
    NSString *stringData;
    
    NSData *reader = [NSData dataWithContentsOfFile:path];
    stringData = [[NSString alloc] initWithData:[reader subdataWithRange:NSMakeRange(0, [temp length])]
                                   encoding:NSUTF8StringEncoding];
    [reader getBytes:&intData range:NSMakeRange([temp length], sizeof(intData))];
    [reader getBytes:&floatData range:NSMakeRange([temp length] + sizeof(intData), sizeof(floatData))];
    NSLog(@"stringData:%@ intData:%d floatData:%f", stringData, intData, floatData);


打印出来的结果:

 

2012-06-17 23:51:14.723 IosSandbox[1285:f803] stringData:nihao hello! intData:1234332 floatData:3.140000

这里把写入的汉字改成了 hello。因为[temp length]算长度是,把中文算成一位了,出来的结果有误。

分享到:
评论

相关推荐

    ios沙盒文件存储操作

    iOS 沙盒文件存储操作 iOS 沙盒机制是 iOS 应用程序的文件存储机制,它提供了一个安全的文件存储环境,保护应用程序的文件不被非法访问。iOS 应用程序只能在自己的沙盒目录中读取文件,不能访问其他应用程序的文件...

    ios-iOS沙盒查看器.zip

    平时真机开发调试App的时候想查看沙盒具体内容一般做法是连接Xcode下载整个App的沙盒,不方便,于是自己写了一个沙盒查看器,支持文件、文件夹的分享功能。 详细介绍:https://www.jianshu.com/p/e45939b6bf3d

    ios-IOS沙盒Files目录说明和常用操作.zip

    在iOS应用开发中,了解和掌握iOS沙盒的Files目录是非常关键的,因为这是应用程序存储、读取和管理数据的主要场所。"iOS沙盒Files目录说明和常用操作"这一主题涵盖了如何有效地利用这个系统来实现数据持久化。下面将...

    iOS沙盒写入读取文件

    在iOS应用开发中,沙盒(Sandbox)是一种安全机制,用于限制应用程序的访问权限,以保护用户数据的安全。每个iOS应用都有自己的独立沙盒,其中包含多个特定的文件夹,如Documents、Library、tmp等。这个“iOS沙盒...

    ios-沙盒文件管理.zip

    "ios-沙盒文件管理.zip" 文件可能包含了一个名为"LZSandBoxManage"的工具或库,用于方便开发者对应用的沙盒内的文件进行操作。 一、沙盒文件系统概述 1. 沙盒结构:每个iOS应用的沙盒由多个目录组成,包括Documents...

    iOS沙盒机制简介

    **沙盒机制**是iOS操作系统中的一项重要安全特性,它确保每个应用程序都运行在一个独立且受限的环境中,以此来保护用户数据的安全和隐私。简单来说,沙盒机制为每一个iOS应用程序创建了一个隔离的“沙盒”,应用程序...

    swift-JXFileBrowserControlleriOS沙盒文件浏览与分享调试控制器

    这个控制器使得开发者可以方便地查看和操作应用程序在iOS设备上的沙盒数据,对于调试和测试用户数据交互非常有帮助。下面将详细介绍`JXFileBrowserController`的相关知识点及其在实际开发中的应用。 ### 1. iOS沙盒...

    Swift编程-iOS应用-沙盒模型

    在iOS系统中,每个应用程序都有一个独立的沙盒空间,这是一个隔离的环境,应用程序只能访问和操作自己沙盒内的资源,不能随意访问其他应用或系统级别的文件。这种设计提高了系统的安全性和稳定性,防止恶意软件的...

    ios沙盒数据存储

    `NSFileManager`是Objective-C中用于文件系统操作的主要类,它提供了多种方法来管理沙盒中的文件和目录。 一、`NSFileManager`基础 `NSFileManager`是一个系统服务类,通过它我们可以进行文件的创建、删除、移动、...

    iOS沙盒机制

    iOS沙盒机制是苹果公司为了增强iOS设备安全性和提升用户体验而设计的一个系统级功能。它为每个应用提供了一个独立的文件系统环境,这种机制被广泛应用于iOS平台的软件开发中。沙盒限制了应用只能访问其特定的文件...

    advanced-2-带沙盒功能.zip

    - **异常处理**:设置异常处理机制,捕获并处理沙盒内的错误和异常。 6. **优化与性能** 使用沙盒可能会带来一定的性能开销,因为需要额外的上下文切换和资源隔离。开发者需要权衡安全性和性能,在满足安全需求的...

    iOS_SandBox沙盒路径获取

    在iOS应用开发中,"沙盒"(Sandbox)是一个重要的概念,它是每个应用程序的专属运行环境,确保了不同应用之间的数据隔离和安全性。每个iOS应用都有自己的沙盒目录,包含若干子目录,用于存储应用的数据、缓存、文档...

    OC-获取沙盒路径,tmp.library

    每个iOS应用都有自己的沙盒环境,这是一个独立的文件系统区域,用于存储应用的数据、缓存、设置等。以下将详细介绍如何在Objective-C中获取这些路径。 1. **沙盒目录结构**: iOS沙盒包括几个主要的目录: - ...

    IOS学习之IOS沙盒(sandbox)机制和文件操作

    IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。通过这张图只能从表层上...

    VOXL - Multiplayer Voxel Sandbox 1.2 - Unity5.5专用的多人游戏模板

    此外,"VOXL - Multiplayer Voxel Sandbox 1.2.unitypackage"文件是Unity的资源包格式,包含了所有模板的预设、材质、脚本和场景。开发者只需将其导入到自己的Unity项目中,即可开始基于此模板进行开发。这大大简化...

    ios-使用NSFileManager管理文件系统.zip

    为了安全起见,iOS系统把每个app及其数据都放在各自的沙盒(sandbox)里面,每个app只能访问自己沙盒目录内的文件和数据等。在安装新的app时,安装程序会在沙箱目录中为app创建多个容器目录,每一个容器目录都有特定...

    iOS端沙盒文件浏览器,可以查看、拷贝、移动、删除等操作.zip

    The iOS sandbox file browser, which has view, copy, move, delete files and other operations. iOS端沙盒文件浏览器,可以查看、拷贝、移动、删除等操作.zip

    Swift-获取沙盒路径-library,tmp

    在iOS应用开发中,每个应用程序都有自己的沙盒环境,这是苹果为确保应用间隔离和数据安全而设计的一个机制。沙盒包含三个主要区域:Documents、Library 和 tmp 目录,每个区域都有特定的用途。本篇文章将深入讲解...

    Swift-一个iOS的沙盒命令行界面

    此外,由于iOS的沙盒限制,我们需要了解如何在特定的沙盒目录下操作文件,如Documents、Library和tmp。 接下来,我们关注`louisdh-openterm-710afa3`这个文件,它可能是一个开源项目,用于在iOS上实现一个命令行...

Global site tag (gtag.js) - Google Analytics