沙盒以及文件操作

时间:2022-11-09 19:03:31

一、沙盒介绍

1、沙盒中有四个文件:

(1)应用程序包:包含所有的资源文件和可执行文件

(2)Document目录:通常存放应用运行时生成的需要保存的文件。iTunes同步设备时会备份该目录。

(3)Library目录:Library目录下又有Caches和Preferences两个子目录。

A、Caches与Doucument一样可以保存应用运行时生成的需要保存的文件,但是iTunes不会备份该目录。

在web服务应用里面,通常会将从服务器得到的数据保存在这个目录下。如果数据丢失,再去服务器获得,所有这个目录下的文件不会被iTunes备份。

B、Preferences放置应用的偏好设置,iOS的设置应用从这里获取该应用的设置。iTunes会备份这个目录。

(4)tmp目录:保存运行时的临时数据,应用停止时,系统会清理该目录下的文件。

2、沙盒文件的路径:

(1)NSString *NSHomeDirectory(void)返回沙盒自身的路径

(2)沙盒下的目录路径可以通过拼接沙盒的路径得到,也可以通过

NSArray *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory,NSSearchPathDomainMask domainMask, BOOL expandTilde)得到。

A、第一个参数为

NSDocumentDirectory和NSCachesDirectory、NSLibraryDirectory分别得到document和caches、library的路径。

后面两个参数固定传入NSUserDomainMask和YES.

B、该函数返回的是数组,在iOS里面,直接取数组的第一个元素。

(3)NSTemporaryDirectory()得到tmp的路径

3、不能在沙盒的根目录下创建文件,可以在三个子目录里面创建文件。

      使用

NSArray *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory,NSSearchPathDomainMask domainMask, BOOL expandTilde)得到的路径会比拼接沙盒路径得到的安全。

二、文件操作

1、创建文件

[fileManager createDirectoryAtPath:photoPathwithIntermediateDirectories:YESattributes:nilerror:nil];

2、删除文件

NSFileManager *manager = [NSFileManagerdefaultManager];

  [managerremoveItemAtPath:tmpDirectory error:nil];

注意:如果路径是文件夹,会连同文件夹和文件夹中的内容一起删除。

如果只想删除文件夹中的所有内容,而不像删除文件夹本身,就得进入文件夹,采用枚举,将里头的文件一个一个删除


3、访问文件

4、写入文件

(1)- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile  
将nsdata数据写入到path路径下。

5、文件属性

参考文章:http://blog.sina.com.cn/s/blog_620d3c8601010gme.html

1、获得文件夹中的所有文件的大小

//单个文件的大小

- (longlong) fileSizeAtPath:(NSString*) filePath{

    NSFileManager* manager = [NSFileManagerdefaultManager];

   if ([manager fileExistsAtPath:filePath]){

        return [[managerattributesOfItemAtPath:filePath error:nil]fileSize];

    }

   return 0;

}

//遍历文件夹获得文件夹大小,返回多少M

- (float ) folderSizeAtPath:(NSString*) folderPath{

    NSFileManager* manager = [NSFileManagerdefaultManager];

   if (![manager fileExistsAtPath:folderPath])

    {

      return 0;

    }

   NSEnumerator *childFilesEnumerator = [[managersubpathsAtPath:folderPath] objectEnumerator];

   NSString* fileName;

   long long folderSize =0;

   while ((fileName = [childFilesEnumerator nextObject]) != nil){

       NSString* fileAbsolutePath = [folderPath stringByAppendingPathComponent:fileName];

        folderSize += [selffileSizeAtPath:fileAbsolutePath];

    }

   return folderSize/(1024.0*1024.0);

}


注意:只能用这种方法得到文件夹中的所有文件的大小,[[manager attributesOfItemAtPath:filePath error:nilfileSize],单位字节,作用于一个文件夹得到的是文件夹本身的一些内容的大小,而不是文件夹中的所有文件的大小。[managersubpathsAtPath:folderPath]返回目录内子文件名称,返回类型nsarray。