• IOS文件管理-NSFileMangager-NSdata


        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:@"%@   %@ ",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;

    }

        

  • 相关阅读:
    SLA合规率是什么? SLA合规率实践分析
    如何借助Site24x7提高Azure VM的灵活性和效率?
    如何避免LLMNR / NBT-NS欺骗攻击?
    ITSM整治混乱秩序 | 看知名研究所如何解决帮助台管理
    如何使用Applications Manager轻松监控Nginx?
    vue中让input框自动聚焦
    pc端手机号填写与验证信息的样式
    vuex里面的this.$store.dispatch 和 this.$store.commit用法以及区别
    Vue 的状态管理工具 Vuex(Vuex的安装与使用)
    详解Vue的钩子函数(路由导航守卫、keep-alive、生命周期钩子)
  • 原文地址:https://www.cnblogs.com/kingbo/p/3733592.html
Copyright © 2020-2023  润新知