Ios下的文件管理, Ios下不像windows 文件系统那样可以访问任何的文件目录,如C盘、D盘什么的。在Ios中每个应用程序只能访问当前程序的目录,也即sandbox(沙盒模型)。

     iOS为每个应用程序分配一个目录,该目录下默认有四个文件目录:

     app:我们程序开发压缩的包文件,包含里面的程序集和资源文件。

     documents:应用程序数据存储在Documents 中,但机于NSUerDefaults的首选设置除外

     Library:基于NSUserDefaults 的首选设置存储在在Library/perfercens文件夹中

     tmp:存储临时文件。

     在本次开发中我的任务是 写相关的错误日志并将其写入到本地文件中,因此我选择的路径是documents。

     我用的是使用NSFileManager 类进行文件管理,NSData进行文件读取,NSMutableData 进行文件写入的方案进行实现的。

     创建NSFileManager 类中碰到的问题倒不是很多,但是用NSData 进行文件读取时,我却碰到总是无法获取句柄的问题(也就无法获取内容信息)

       一开始我用的方法: [NSData dataWithContentsOfFile:path] path为整个文件的全路径,但是不论我怎么尝试,还是无法获取里面的内容。

    后来我结合NSFileManager 来进行读取数据(在这里文件都是已经存在的)步骤如下: 

  例如:我们要读取的文件为:documents/cordova/log/201405.log

     1、需要通过[NSFileManager changeCurrentDircectoryPath:[filePath stringByExpandingTildeInPath]]; 方法切换到documents/cordova/log  目录下面。(filePath 就是指定的该全部目录 具体可以参考NSSearchPathForDirectoriesInDomains 方法)

     2、然后使用NSData *reader= [NSData dataWithContentsOfFile:@"201405.log"]  方法直接读取当前文件夹下的文件数据,这里已经将数据读取到内存中。

     3、最后追加内容写入,

           NSMutableData *write=[[NSMutableData alloc] initWithData:reader];--NSdata 初始化

           [write appendData:meage] --添加数据

           [write writeToFile:@“201405.log” atomically:YES];

     其实我也不明白为什么直接给NSData全路径会出现得不到数据的问题。还有听说很多人说NSUrl 方式来写入和读取数据比较好。 下次若有时间也去好好体验一次。。。。这里先保留了! 

   

 二、文件日志 读写文件

//读写操作

+(void)Info:(NSString *)message

{

 

    @synchronized(self){//  读写线程安全

 

    // DBNAME 是要查找的文件名字,文件全名

    NSString *filePath = [self getLogBasePath];

    NSFileManager *fileManager = [NSFileManager defaultManager];

        

        

        BOOL isDirtory=NO;

    if (!([fileManager fileExistsAtPath:filePath isDirectory:&isDirtory]&&isDirtory)) {

         //若不存在文件夹则创建文件夹

        [fileManager createDirectoryAtPath:filePath withIntermediateDirectories:NO attributes:nil error:nil];

    }

     NSString *date=  [[NSDate date] ToStringWithFormmate:@"yyyyMMdd"];

     NSString *dateLogName=[date stringByAppendingString:@".txt"];

        

    NSString *dateFilePath= [filePath stringByAppendingPathComponent:dateLogName];

        if (![fileManager fileExistsAtPath:dateFilePath]) {

            //文件不存在则创建

            if(![fileManager createFileAtPath:dateFilePath contents:nil attributes:nil])return;

        }

        

        NSString *time=[[NSDate date] ToStringWithFormmate:@"yyyy-MM-dd hh:mm:ss"];

        NSString *logMessage=[[NSString alloc] initWithFormat:@"%@   %@ \n",time,message];

        

        NSData *reader= [NSData dataWithContentsOfFile:dateFilePath];

        NSMutableData *write=[[NSMutableData alloc] initWithData:reader];//NSdata 初始化

        [write appendData:[logMessage dataUsingEncoding:NSUTF8StringEncoding]]; //添加数据

       BOOL reslut= [write writeToFile:dateFilePath atomically:YES];

        if (reslut) {

            NSLog(@"success");

        }else

        {

            NSLog(@"fail");

        }

    }

}

 

     日志读取

 

+(NSString*) readFileWithName:(NSString*)name

{

    NSString *filePath = [self getLogBasePath];

 

    NSData *reader= [NSData dataWithContentsOfFile:[filePath stringByAppendingPathComponent:name]];

    

    NSString *result=[[NSString alloc] initWithData:reader encoding:NSUTF8StringEncoding];

    

    return result;

}

+(NSString*)getLogBasePath //公用方法获取指定的目录

{

 

    NSArray *directoryPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentDirectory = [directoryPaths objectAtIndex:0];

    // DBNAME 是要查找的文件名字,文件全名

    NSString *filePath = [documentDirectory stringByAppendingPathComponent:@"log"];

    return filePath;

}