iOS开发系列----OC(文件管理类、文件句柄类)

转载链接

1.NSString和NSData互相转化

NSString * str = @"hello世界";
NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"数据大小:%lu",data.length);
NSLog(@"字符串长度:%lu",str.length);

//一个汉字的长度是1,占3个字节
NSString * strData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",strData);

2.文件管理类NSFileManager
对文件进行管理操作:
①遍历查看目录下的文件
【深度遍历】
【浅度遍历】
②创建文件/目录
③拷贝文件/目录
④移动文件/目录
⑤删除文件/目录
⑥获取文件属性

新建HTFileManager类

①HTFileManager.h

#import <Foundation/Foundation.h>

@interface HTFileManager : NSObject

//创建文件目录/文件
+(void)createDirectoryOrFile;

//遍历目录下的内容
+(void)scanDirectoryOrFile;

//拷贝文件/目录
+(void)copyDirectoryOrFile;

//移动文件/目录
+(void)moveDirectoryOrFile;

//删除文件/目录
+(void)removeDirectoryOrFile;

//获取文件属性
+(void)attributeForDirectoryOrFile;

@end

②HTFileManager.m

#import "HTFileManager.h"

#define Desktop @"/Users/yimiyangguang/Desktop"

#define FILM @"/Users/yimiyangguang/Desktop/Film1"

@implementation HTFileManager

+ (void)createDirectoryOrFile {
    NSFileManager * fileManager = [NSFileManager defaultManager];

    //在桌面上创建一个文件夹 Film1
    NSString * path = [Desktop stringByAppendingPathComponent:@"Film1"];
    NSLog(@"Path = %@",path);

    //判断一个目录是否存在,不存在则创建
    if (![fileManager fileExistsAtPath:path]) {
        NSError * error = nil;

        /**
         *  @param  path:目录的路径
         *  @param  createIntermediates:中间目录是否缺省,默认填YES
         *  @param  attributes:目录的属性,默认填nil,(包含默认属性)
         *  @param  error:&error
         */
        BOOL success = [fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error];
        if (success) {
            NSLog(@"目录创建成功");
        }else{
            NSLog(@"目录创建失败,error:%@",error);
        }

    }else{
        NSLog(@"该目录已存在");
    }

    //创建一个文件 test.txt
    NSString * filePath = [path stringByAppendingPathComponent:@"test.txt"];
    NSString * content = @"睡一觉,明天更美好!";
    NSData * data = [content dataUsingEncoding:NSUTF8StringEncoding];

    if (![fileManager fileExistsAtPath:filePath]) {

        /**
         *  @param  path:文件路径
         *  @param  data:文件的内容,当是nil,创建出的是空文件
         *  @param  attr:文件的属性
         */
        BOOL success = [fileManager createFileAtPath:filePath contents:data attributes:nil];
        if (success) {
            NSLog(@"文件创建成功");
        }else {
            NSLog(@"文件创建失败");
        }

    }else{
        NSLog(@"文件已存在");
    }
}

+ (void)scanDirectoryOrFile {
    NSFileManager * fileManager = [NSFileManager defaultManager];

    //浅度遍历(一级目录)
    if ([fileManager fileExistsAtPath:@"/Users/yimiyangguang/Desktop/Film1"]) {

        NSArray * array = [fileManager contentsOfDirectoryAtPath:@"/Users/yimiyangguang/Desktop/Film1" error:nil];

        NSLog(@"%@",array);
    }

    //深度遍历(子目录的子目录的子目录。。。)
    if ([fileManager fileExistsAtPath:@"/Users/yimiyangguang/Desktop/Film1"]) {

        NSArray * array = [fileManager subpathsOfDirectoryAtPath:@"/Users/yimiyangguang/Desktop/Film1" error:nil];

        NSLog(@"深度遍历:%@",array);
    }
}

+ (void)copyDirectoryOrFile {
    NSFileManager * fm = [NSFileManager defaultManager];

    NSString * strPath = FILM;
    NSString * dstPath = @"/Users/yimiyangguang/Desktop/File2";

    NSError * error = nil;

    if ([fm fileExistsAtPath:strPath]) {

        /**
         *  @param  srcPath:原路径
         *  @param  dstPath:目的路径
         *  @error  error:&error
         */
        BOOL success = [fm copyItemAtPath:strPath toPath:dstPath error:&error];
        if (success) {
            NSLog(@"copy 成功");
        }else {
            NSLog(@"copy 失败 %@",error);
        }
    }else {
        NSLog(@"源文件不存在");
    }
}

+ (void)moveDirectoryOrFile {
    NSFileManager * fm = [NSFileManager defaultManager];

    //移动的过程中也可以修改文件名
    NSString * srcPath = FILM;
    NSString * desPath = @"/Users/yimiyangguang/Desktop/File2/File3";

    NSError * error = nil;
    BOOL success = [fm moveItemAtPath:srcPath toPath:desPath error:&error];
    if (success) {
        NSLog(@"move 成功");
    }
}

+ (void)removeDirectoryOrFile {
    NSFileManager * fm = [NSFileManager defaultManager];

    NSString * path = @"/Users/yimiyangguang/Desktop/File2/File3";

    if ([fm fileExistsAtPath:path]) {
        BOOL success = [fm removeItemAtPath:path error:nil];
        if (success) {
            NSLog(@"success");
        }else{
            NSLog(@"failed");
        }
    }
}

+ (void)attributeForDirectoryOrFile {
    NSFileManager * fm = [NSFileManager defaultManager];

    NSString * path = @"/Users/yimiyangguang/Desktop/File2/Second/4.jpg";

    if ([fm fileExistsAtPath:path]) {
        NSDictionary * dict = [fm attributesOfItemAtPath:path error:nil];
        NSLog(@"%@",dict);
    }
}

@end

③main.m

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "HTFileManager.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        //依次调用文件管理方法进行测试
        [HTFileManager createDirectoryOrFile];
        [HTFileManager scanDirectoryOrFile];
        [HTFileManager copyDirectoryOrFile];
        [HTFileManager moveDirectoryOrFile];
        [HTFileManager removeDirectoryOrFile];
        [HTFileManager attributeForDirectoryOrFile];
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

3.文件句柄类NSFileHandle
①对文件进行读写首先需要NSFileHandle打开文件
②NSFileHandle对文件进行读写都是NSData类型的二进制数据
③NSData与NSString之间的相互转换
④操作文件完成后,记得closeFile

实际操作:
①对文件写入数据
②对文件中的数据定位
③复制文件中的内容

新建HTFileHandle文件

①HTFileHandle.h

#import <Foundation/Foundation.h>

@interface HTFileHandle : NSObject

+ (void)test;

@end

②HTFileHandle.m

#import "HTFileHandle.h"

#define FILE_PATH @"/Users/yimiyangguang/Desktop/test.txt"

@implementation HTFileHandle

+ (void)test {
    /**
     *  类方法中self代表的是当前类LPCFileManager
     *  对象方法中self代表的是指向当前类LPCFileManager的对象
     */
    //读取文件内容
    [self readFile];

    //将内容写入文件
    [self writeFile];
}

+ (void)readFile {

    /**
     *  以只读方式打开:[NSFileHandle fileHandleForReadingAtPath:FILE_PATH];
     *  以读写方式打开:[NSFileHandle fileHandleForUpdatingAtPath:FILE_PATH];
     */
    NSFileHandle * fh = [NSFileHandle fileHandleForReadingAtPath:FILE_PATH];
    NSData * data = [fh readDataToEndOfFile];

    //把NSData转化为NSString
    NSString * content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@",content);

    //设置偏移量:因为一个汉字占3个字节,当设置偏移量或获取长度的时候,不能取到汉字的中间位置
    [fh seekToFileOffset:1 * 3];

    //读取指定长度的数据
    NSData * data2 = [fh readDataOfLength:3 * 1];

    NSString * content2 = [[NSString alloc] initWithData:data2 encoding:NSUTF8StringEncoding];
    NSLog(@"%@",content2);

    //关闭文件
    [fh closeFile];
}

+ (void)writeFile {

    /**
     *  以只写方式打开:[NSFileHandle fileHandleForWritingAtPath:FILE_PATH];
     *  以读写方式打开:[NSFileHandle fileHandleForUpdatingAtPath:FILE_PATH];
     */
    NSFileHandle * fh = [NSFileHandle fileHandleForUpdatingAtPath:FILE_PATH];

    //在文件的末端写入数据(追加内容)
    [fh seekToEndOfFile];

    NSString * str = @"我们应该原谅他吗?";
    NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];
    [fh writeData:data];

    [fh closeFile];
}

@end

③main.m

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "HTFileHandle.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        [HTFileHandle test];
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
上一篇:IOS基础之 (二) 面向对象思想


下一篇:RMAN 备份案例-shell 脚本