【OC学习-23】NSFileManager、NSFileHandle、NSData的注意事项和常用操作归纳

(1)用一个例子看文件管理器以及获取文件属性,其中文件大小以及修改日期属性比较重要。我们需要了解这些属性,这样在操作文件属性的时候可以直接调用。比如用[dic1 objectForKey:NSFileSize]属性来输出文件的大小。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {

    @autoreleasepool {
        //获取文件管理器
        NSFileManager *file1=[NSFileManager defaultManager];
        //我们利用桌面上的一个文件来看看文件属性
        NSString *path=@"/Users/Andy/Desktop/economist.pdf";
        //文件属性返回的是一个字典,所以用一个字典去接
        NSError *error1;
        NSDictionary *dic1=[file1 attributesOfItemAtPath:path error:&error1];
        //如果成功,则忽略错误,如果失败则把失败信息写入error里面,所以有如下判断
        if (error1!=nil) {
            NSLog(@"WRONG");
        }else{
            NSLog(@"%@",dic1);
        }
    }
    return 0;
}
部分输出结果:

    NSFileExtensionHidden = 0;
    NSFileGroupOwnerAccountID = 20;
    NSFileGroupOwnerAccountName = staff;
    NSFileHFSCreatorCode = 0;
    NSFileHFSTypeCode = 0;
    NSFileModificationDate = "2014-08-30 08:57:51 +0000";
    NSFileOwnerAccountID = 501;
    NSFileOwnerAccountName = Andy;
    NSFilePosixPermissions = 420;
    NSFileReferenceCount = 1;
    NSFileSize = 49847196;
    NSFileSystemFileNumber = 1116354;
    NSFileSystemNumber = 16777217;
    NSFileType = NSFileTypeRegular;

说明:

a:NSFileHandle只能打开现成的文件,所以如果是新文件则需要NSFileManager先创建新文件;

b:打开一个文件就后,就需要关闭一个文件;

c:根据不同的要求可能要设定不同的偏移量(即光标所在位置),可以通过移动到开头或结尾,也可以先获取当前位置然后增加和减少多少字节来移动;

d:文件路径是NSString对象,可以用stringByAppendingPathComponent+文件全称方法构造一个完整的文件路径;

e:往文件里面写的内容是NSData,如果是其他的格式则可以用dataUsingEncoding:NSUTF8StringEncoding来转化成data类型;

f:同样,目录的写法于Linux类似,~家目录,/根目录,.当前目录,..父目录,用/表示层级等。

g:NSFileManager可以管理文件,但是很细致的比如读取文件里部分数据这些需要用NSFileHandle。


(2)获取一个路径下所有文件以及子目录列表

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {

    @autoreleasepool {
        //获取文件管理器
        NSFileManager *file1=[NSFileManager defaultManager];
        //比如桌面上又一个img文件夹
        NSString *path=@"/Users/Andy/Desktop/img";
        NSError *error2;
        //是一个数组,但只能获取第一级的子目录
        NSArray *arr1=[file1 contentsOfDirectoryAtPath:path error:&error2];
        NSLog(@"%@",arr1);
        //能够获取所有层级的子目录
        NSArray *arr2=[file1 subpathsOfDirectoryAtPath:path error:&error2];
        NSLog(@"%@",arr2);
    }
    return 0;
}

(3)目录管理(创建、拷贝、剪切、删除等)

int main(int argc, const char * argv[]) {

    @autoreleasepool {
        //获取文件管理器
        NSFileManager *file1=[NSFileManager defaultManager];
        //创建目录(文件夹)
        NSString *path=@"/Users/Andy/Desktop/hello/aaa";
        NSError *err1;
        //当withIntermediateDirectories为YES时可以创建多层级目录,而如果是NO只能创建1级目录,后面的层级不能够被创建
        [file1 createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&err1];
        //移动目录,相当于剪切。伪剪切,因为不能剪切到已存在的目录里面,其实相当于重命名文件一样
        NSString *pathSrc=@"/Users/Andy/Desktop/hello";
        NSString *pathTo=@"/Users/Andy/Desktop/newhello";
        [file1 moveItemAtPath:pathSrc toPath:pathTo error:&err1];
        //拷贝文件,伪拷贝,因为不能拷贝到已存在的目录里面,其实相当于重新创建一个新的文件夹
        [file1 copyItemAtPath:pathSrc toPath:pathTo error:&err1];
        //删除目录
        [file1 removeItemAtPath:pathTo error:&err1];
    }
    return 0;
}

(4)文件管理(创建、复制、删除等)

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {

    @autoreleasepool {
        //获取文件需要用NSData二进制文件存储,类似于把文件打散成二进制的存起来,然后把这个文件写到其他地方去
        //data里面的大小就是文件的大小
        NSString *path1=@"/Users/Andy/Desktop/economist.pdf";
        NSData *data1=[NSData dataWithContentsOfFile:path1];
        NSLog(@"%lu",(unsigned long)data1.length);
        
        //创建一个文件。文件的内容需要data类型,所以需要用到像上面那样先由一个data数据,如有其他类型,也许转化成data类型
        NSFileManager *file1=[NSFileManager defaultManager];
        NSString *path2=@"/Users/Andy/Desktop/newfile.pdf";
        [file1 createFileAtPath:path2 contents:data1 attributes:nil];
        
        //移动文件,注意的是需要把文件的完整路径写出来,包括文件名
        NSString *path3=@"/Users/Andy/Desktop/newhello/economist.pdf";
        NSError *err1;
        [file1 moveItemAtPath:path1 toPath:path3 error:&err1];
        
        //删除文件
        [file1 removeItemAtPath:path1 error:&err1];
    }
    return 0;
}

(5)NSData

我们可以利用writeToFile把一个字符串写入到文件中,我们data对象也能调用这个方法把数据写入到文件中。但是我们从文件中读取的素具都是NSData类型,所以需要用一个NSData数据接收。


NSData是不可变长度的,只能一次性全部加载数据。此时NSMutableData出场。

我们可以吧NSString类型转换成NSData类型,然后利用NSData的appendData方法逐个添加数据到这个NSMutableData中。

int main(int argc, const char * argv[]) {

    @autoreleasepool {
        //创建NSString
        NSString *str1=@"hello";
        NSString *str2=@"world";
        //NSString转NSData
        NSData *d1=[str1 dataUsingEncoding:NSUTF8StringEncoding];
        NSData *d2=[str2 dataUsingEncoding:NSUTF8StringEncoding];
        //创建一个NSMutableData数据
        NSMutableData *muData1=[[NSMutableData alloc]init];
        //添加data数据
        [muData1 appendData:d1];
        [muData1 appendData:d2];
        //再把这个muData1写入到一个文件中,如文件不存在则创建后再写入
        NSString *path0=@"/Users/Andy/Desktop/hello.txt";
        [muData1 writeToFile:path0 atomically:YES];
    }
    return 0;
}

()NSFileHandle(详见:http://blog.csdn.net/enuola/article/details/7797055)



()NSFileManager(详见:http://www.cnblogs.com/jiangyuxuan/archive/2013/03/09/2950988.html)




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值