文件操作

来源:互联网 发布:linux zip 压缩 编辑:程序博客网 时间:2024/06/01 08:16

【说明】

nslog:写
stdout [屏幕也是文件]
按键盘:写
文件操作我们分为两类
对于文件夹:创建、删除、拷贝、移动、查看
对于普通文件来说:读取信息和写入信息
1.读
从存储设备到内存是读文件
2.写
从内存到存储设备是写文件
framebuffer

【文件管理类】【NSFileManager】

NSUTF8StringEncoding:可打印汉字

#define SHOWARRAY(array) for(NSString * str in array){\ NSLog(@"%@",str);\}#define SHOWERROR(X) if (error) {\                //打印错误信息\                  perror(X);\         NSLog(@"%@",error);\                   exit(-1);\}//NSFileManager文件管理类    单例对象,有且只能创建一次    NSFileManager *fm = [NSFileManager defaultManager];    NSLog(@"%@",fm);// _autoreleasing只是来修饰NSError[只在ARC下我们需要写]  error = nil;    NSError * __autoreleasing error = nil;    //error存放的是 该方法的一个错误信息[文件操作必须写Error]    //从指定的路径中读取一个文件,里面的所有信息,都会被保存到数组当中去    //浅度遍历    NSArray * array=[fm contentsOfDirectoryAtPath:PATH error:&error];    SHOWERROR("contentsOfDirectory");//深度遍历来展示该目录下的所有文件【包括子目录】    array = [fm subpathsOfDirectoryAtPath:PATH error:&error];//创建一个文件夹    NSString *subPath = [PATH stringByAppendingPathComponent:@"middle/dir"];    [fm createDirectoryAtPath:subPath withIntermediateDirectories:YES attributes:nil error:&error];    //第一个参数:创建文件夹的路径+该文件夹名    //第二个参数:表示是否创建中间目录[可以为多个],如果创建YES,否则NO    //第三个参数:表示文件的属性,通常默认nil,表示默认属性    //第四个参数,表示错误信息//创建一个文件【必须有后缀】    //NSDate OC下的二进制数据类型    NSString *contents = @"我是写入的数据";    NSData *data = [contents dataUsingEncoding:NSUTF8StringEncoding];    NSString * filePath=[subPath stringByAppendingPathComponent:@"zn.txt"];    [fm createFileAtPath:filePath contents:data attributes:nil];    //第一个参数:创建文件的路径+该文件的名字(文件后缀)【必须有后缀】    //第二个参数:写入文件的内容    //第三个参数:属性,默认nil,表示默认属性(可读、可写不可执行)//删除文件 @"middle/dir"[也可删除文件]    [fm removeItemAtPath:subPath error:&error];//拷贝文件夹或者文件,如果文件和目录已经存在,就不能再拷贝了    NSString * dst = [PATH stringByAppendingPathComponent:@"middeleCopy"];    NSString * src = [PATH stringByAppendingPathComponent:@"middele"];    [fm copyItemAtPath:src toPath:dst error:&error];//移动文件或者文件夹,如果文件或者文件夹已存在,会失败【把里面的内容移动过去】    //移动文件或文件夹,如果文件或文件夹存在,会失败NSString * dst1 = [PATH stringByAppendingPathComponent:@"middleMove/test"];    NSString * src1 = [PATH stringByAppendingPathComponent:@"middle"];    [fm moveItemAtPath:src1  toPath:dst1 error:&error];

【文件句柄】【NSFileHandle】

文件标号

1.对文件本身操作

//NSFileManager文件管理类    单例对象,有且只能创建一次    NSFileManager *fm = [NSFileManager defaultManager];// _autoreleasing只是来修饰NSError[只在ARC下我们需要写]  error = nil;    NSError * __autoreleasing error = nil;    //error存放的是 该方法的一个错误信息[文件操作必须写Error]    //从指定的路径中读取一个文件,里面的所有信息,都会被保存到数组当中去//浅度遍历    NSArray * array=[fm contentsOfDirectoryAtPath:PATH error:&error];    SHOWERROR("contentsOfDirectory");//深度遍历来展示该目录下的所有文件【包括子目录】    array = [fm subpathsOfDirectoryAtPath:PATH error:&error];    SHOWERROR("subpathsOfDirectory");//创建一个文件夹    //拼接路径    NSString *subPath = [PATH stringByAppendingPathComponent:@"middle/dir"];   // [fm createDirectoryAtPath:subPath withIntermediateDirectories:YES attributes:nil error:&error];    //第一个参数:创建文件夹的路径+该文件夹名    //第二个参数:表示是否创建中间目录[可以为多个],如果创建YES,否则NO    //第三个参数:表示文件的属性,通常默认nil,表示默认属性    //第四个参数,表示错误信息//创建一个文件【必须有后缀】    //NSDate OC下的二进制数据类型    NSString * filePath=[subPath stringByAppendingPathComponent:@"zn.txt"];    NSString * contents = @"我是写入的数据";    NSData * data = [contents dataUsingEncoding:NSUTF8StringEncoding];    [fm createFileAtPath:filePath contents:data attributes:nil];    //第一个参数:创建文件的路径+该文件的名字(文件后缀)【必须有后缀】    //第二个参数:写入文件的内容    //第三个参数:属性,默认nil,表示默认属性(可读、可写不可执行)//删除文件 @"middle/dir"[也可删除文件]    [fm removeItemAtPath:subPath error:&error];    [fm removeItemAtPath:filePath error:&error];//拷贝文件夹或者文件,如果文件和目录已经存在,就不能再拷贝了    NSString * dst = [PATH stringByAppendingPathComponent:@"middeleCopy"];    NSString * src = [PATH stringByAppendingPathComponent:@"middele"];    [fm copyItemAtPath:src toPath:dst error:&error];//移动文件或者文件夹,如果文件或者文件夹已存在,会失败【把里面的内容移动过去】    //移动文件或文件夹,如果文件或文件夹存在,会失败    NSString * dst1 = [PATH stringByAppendingPathComponent:@"middleMove/test"];    NSString * src1 = [PATH stringByAppendingPathComponent:@"middle"];    [fm moveItemAtPath:src1  toPath:dst1 error:&error];#define SHOWERROR(X) if (error) {\                //打印错误信息\                  perror(X);\                  NSLog(@"%@",error);\                   exit(-1);\                    }//创建一个文件夹    [fm createDirectoryAtPath:[NSString stringWithFormat:@"%@/middle/dir",PATH] withIntermediateDirectories:YES attributes:nil error:&error];    if (error) {        NSLog(@"%@",error);        exit(-1);    }    //创建一个文件    [fm createFileAtPath:[NSString stringWithFormat:@"%@/middle/dir/file",PATH] contents:[@"hello" dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];    //创建文件时,直接添加了内容@"hello",也可不添加,写为nil    //attributes文件属性   nil 表示使用文件默认的属性    [fm createFileAtPath:[NSString stringWithFormat:@"%@/middle/dir/file1",PATH] contents:nil attributes:nil];    //文件的删除【目录,文件】    [fm removeItemAtPath:[NSString stringWithFormat:@"%@/middle",PATH] error:&error];    if (error) {        NSLog(@"%@",error);        exit(-1);    //拷贝:不分文件和路径的    [fm copyItemAtPath:[NSString stringWithFormat:@"%@/DogAndCat",PATH] toPath:[NSString stringWithFormat:@"%@/DogAndCat2",PATH] error:&error];//move[剪切] [fm moveItemAtPath:[NSString stringWithFormat:@"%@/DogAndCat",PATH] toPath:[NSString stringWithFormat:@"%@/DogAndCat2/DogAndCat",PATH] error:&error];

2.对文件内容的操作

NSHandle[文件句柄]
读和写(c 中的文件指针,文件描述符)

//以只读方式打开文件,生成文件句柄    //文件句柄类,创建了一个句柄,可以从该据并重读取信息,就相当于读取该文件    NSFileHandle *fh = [NSFileHandle fileHandleForReadingAtPath:PATH];    //写    //NSFileHandle *fh2 = [NSFileHandle fileHandleForWritingAtPath:PATH];    //读写    //NSFileHandle *fh3 = [NSFileHandle fileHandleForUpdatingAtPath:PATH];    //通过一个读文件的句柄,获取文件内容    //从内存到硬盘是写;从硬盘到内存是读    //读3个字节    //获取指定字节的文件内容,这里读取文件的单位是字节数    //在文件操作中,有一个文件指示器,来记录当前读取或者写入的操作位置,如果没有对这个文件指示器进行操作,那么下一次对文件的操作,就从该位置开始    //如果读物的文件都是中文,那么不能出现半个字    NSData *data=[fh readDataOfLength:100];    NSString * str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];    NSLog(@"%@",str); //每次读取后,下次会继续往后面读    //读指针偏移,每次读的结果接着上一次    //设置文件偏移量    //以文件开头文参照,单位字节数    [fh seekToFileOffset:0];    //将文件指示器设置到文件的末尾,通常是为了往文件中追加写    //[fh seekToEndOfFile];    data = [fh readDataOfLength:100];    NSString * str1 = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];    NSLog(@"%@",str1);    //读到末尾  EOF:end of file    //一口气把文件读完【IOS基本都是这样的,直接读完】    //data=[fh readDataToEndOfFile];    //把OC的二进制文件转换为NSString   // NSString * str2 = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];   // NSLog(@"%@",str2); //写操作    NSFileHandle *fh = [NSFileHandle fileHandleForWritingAtPath:PATH];    NSString * string = @"天王盖地虎,12345\n";    NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding];    //文件截断【预留这么多字节】    //将文件的大小设置成offset之后的数值    [fh truncateFileAtOffset:20];    //放在末尾,追加写    //[fh seekToEndOfFile];    //int n = 10;[循环打10行]    //while (n-->0) {        [fh writeData:data];    //}//判断是文件还是文件夹int main(int argc, const char * argv[]) {@autoreleasepool {    //获取文件属性,文件属性是以字典形式读取的    NSFileManager * fm = [NSFileManager defaultManager];    //保存错误信息【__autoreleasing(自动释放)应该是2个下划线】    NSError *__autoreleasing error = nil;   //给数据字典赋值    NSDictionary *attributes = [fm attributesOfItemAtPath:PATH error:&error];    if (error) {        perror("attributesOfItemAtPath");        NSLog(@"%@",error);        //exit(-1);//程序异常退出    }    NSLog(@"%@",attributes);//判断这个文件是否存在BOOL ret=[fm fileExistsAtPath:PATH];    if (YES==ret) {        NSLog(@"该文件或者目录存在");    }    else    {        NSLog(@"该文件或者目录不存在");    }//判断是不是目录BOOL isDirectory = NO;    //判断文件是不是存在,并且判断他是不是一个文件夹,通过第二个参数的值来判定ret=[fm fileExistsAtPath:PATH isDirectory:&isDirectory];    //方法的返回值,表示该文件或者文件夹是否存在    //isDirectory表示如果YES,这个是一个文件夹,如果NO,这是一个文件    if (YES==ret) {        if (YES==isDirectory) {            NSLog(@"This is Directory");        }        else{            NSLog(@"This is a file");        }    }    else    {        NSLog(@"File NO exit");    } }return 0;}

1.读取一个文件的内容,然后在代码中,创建一个文件,将读取的文件写入创建的文件

#define  PATH @"/Users/qf/Desktop/1"#define BUFF 100int main(int argc, const char * argv[]) {@autoreleasepool {           //创建一个文件管理对象    NSFileManager *fm = [NSFileManager defaultManager];       NSString * fileString =[PATH stringByAppendingPathComponent:@"zn1.txt"];    //创建目标文件    BOOL ret=[fm createFileAtPath:fileString contents:nil attributes:nil];            if (NO==ret) {        NSLog(@"Create Faild");        exit(-1);    }        //创建读文件句柄,操作被复制的文件    NSFileHandle *fhForReading = [NSFileHandle fileHandleForReadingAtPath:[PATH stringByAppendingPathComponent:@"zn.txt"]];    //把被复制的文件内容全部读出来    //创建一个写文件的句柄,操作目标文件    NSFileHandle *fhForWriting = [NSFileHandle fileHandleForWritingAtPath:fileString];    //这样写可以,但一般使用循环实现写    //[fh2 writeData:data];    //单位:字节-数,求出数据长度    //NSInteger length = [data length];    //为了节省内存的占用,通常我们会限制读取和写入的操作,读多少写多少    NSDictionary * dict = [fm attributesOfItemAtPath:[PATH stringByAppendingPathComponent:@"zn.txt"] error:nil];    NSInteger length = [dict fileSize];    NSInteger length1 = [dict[NSFileSize] integerValue];    NSData * data = nil;    NSLog(@"%ld",length1);    while (length>0) {        //当剩余的文件字节数,小于设置的读取长度        if (BUFF>length) {            //直接把文件读到末尾            data = [fhForReading readDataToEndOfFile];            [fhForWriting writeData:data];            break;        }        data = [fhForReading readDataOfLength:BUFF];        [fhForWriting writeData:data];        length -= BUFF;    }        }return 0;}
原创粉丝点击