OC的文件管理类NSFileManager类的使用详解

1、NSFileManager介绍
NSManager是用来管理文件系统的
它可以用来进行常见的文件\文件夹操作(拷贝、剪切、创建等)
NSFileManager使用了单例模式singleon
使用defaultManager方法可以获得那个单例对象
[NSFileManager defaultManager];
单例对象:整个程序运行运行期间只存在一个对象。
2、NSFileManager用于判断:
(1)判断文件或目录是否存在
(2)判断是否是一个目录
(3)判断文件是否可读
(4)判断文件是否可写
(5)判断文件是否可删除
注意:不用手动敲写某个文件的路径,直接把文件拖进Xcode代码编辑界面即可获得文件的路径。
NSString *filePath=@“/Users/apple/Desktop/1.txt”; 或
NSString *filePath=[NSString sringWithFormat:@“@/Desktop/1.txt”,NSHomeDirectory()];  
NSHomeDirectory方法用于获取根路径”/Users/用户名”。
步骤如下:在使用这些功能之前,首先创建一个单例对象:
NSManager *fm=[NSFileManager defaultManager];
1)判断文件或目录是否存在方法如下。fileExistsAtPath: path
Bool isYES=[fm fileExistsAtPath: filePath]; // 返回1或0
2)判断是否是一个目录方法如下。在确定存在的基础上用如下方法进行判断。[fm fileExistsAtPath  isDirectory: &isDir];即:
if(isYes){
BOOL isDir;
[fm fileExistsAtPath  isDirectory: &isDir];// 传入布尔变量的地址
if(isDir){
     NSLog(@“这是一个目录”); 
    }else NSLog(@“这不是一个目录”);
}
3)判断文件是否可读。用isReadableFileAtPath: filePath即可
isYes=[fm isReadableFileAtPath: filePath];
4)判断一个路径或文件是否可写。isWritableFileAtPath:filePath
isYes=[fm isWritableFileAtPath: filePath];
5)判断一个文件/目录是否可删除 isDeletableFileAtPath: filePath
注意:目录的后缀不是文件名而是文件夹名。系统文件目录是不允许删除的。
3、NSFileManager用于文件访问
(1)如何获取文件的信息(属性)
(2)获取指定目录下的文件及子目录
(3)获取指定目录下的子目录(不再获取后代路径)
步骤同上:先创建文件对象——>创建NSFileManager——>调用方法
NSManager *fm=[NSFileManager defaultManager];
NSString *filePath=@“Users/apple/Desktop/1.txt”;
1)获取文件的属性。利用创建好的NSFileManager对象调用它的一个对象方法attributesOfItemAtPath方法返回一个存放许多表示文件属性键值对的字典。举例如下:
NSDictionary  *dict=[fm attributesOfItemAtPath: filePath  error: nil];
然后直接打印字典对象即可显示文件的所有信息,即
NSLog(@“%@”,dict);即可。若想获得确切的某个属性的信息则可以打印
[dict objectForKey:@“XXX”];或dict[@“XXX”];
2)获取当前目录及所有子目录下的文件及文件夹。
  方式一:使用递归的方式 获取当前目录及子目录下的所有的文件及文件夹 调用:利用NSFileManager对象调用subpathsAtPath: dirPath方法即可。
NSArray *subPaths=[fm subpathsAtPath: dirPath];
  方式二:用NSFileManager对象调用subpathsOfDirectoryAtPath: dirPath
方法,此方法功能同上,但不是使用递归进行实现的,效率较高,常用。
例:NSArray *subPaths=[fm subpathsOfDirectoryAtPath: dirPath  error: nil];
3)获取指定目录下的子目录(不再获取后代路径)
用NSFileManager对象调用contentsOfDirectoryAtPath方法即可,返回一个NSArray数组,举例调用如下:
NSArray *subPath=[fm contentsOfDirectoryAtPath: dirPath  error: nil];
4、NSFileManager用于文件操作
文件操作分为以下几个部分:
(1)如何创建目录
(2)如何创建文件
(3)如何复制文件/文件夹
(4)如何移动文件/文件夹
(5)如何删除文件/文件夹
首先创建一个NSManager对象,并制定一个目录
NSString *createDirPath=@“/Users/apple/Desktop/1.txt”;
NSFileManager *fm=[NSFileManager defaultManager];
1)创建目录:
用NSFileManager对象调用CreateDirectoryAtPath方法
- (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates 
attributes:(NSDictionary *)attributes 
error:(NSError **)error NS_AVAILABLE(10_5, 2_0);
path: 路径
createIntermediates: YES/NO   表示在创建路径的时候如果发现路径缺失即指定路径中有的文件夹不存在时让系统自动创建/或不创建并报错,就是说YES会创建路径中缺少的目录,NO不会创建路径中缺少的目录。
attributes: 属性的字典 ,如果不想获取属性可以传入空值nil
error:错误对象,一般都传入空值
举例如下:BOOL isYES=[fm createDirectoryAtPath: createDirPath   
withIntermediateDirectories: YES   attributes:nil   error: nil];
if(isYES){   NSLog(@“创建路径成功”);}
2)创建文件
创建文件之前先创建文件路径保证无缺失文件夹。首先创建指定路径,假设创建后的文件路径为/Users/apple/Desktop/aaa/
设定创建后的文件NSString *createDirPath=@“/Users/apple/Desktop/aaa/a.txt”
方法一:NSString对象的writeToFile对象方法(将字符串写入文件)
方法二:利用NSFileManager单例对象的对象方法,格式如下:
[fm createFileAtPath:@“路径”contents:NSData类型的数据  attributs :文件的属性字典  ]
注意:NSData是一个处理二进制文件的类。可以首先将NSString——>NSData   利用NSString的对象方法dataUsingEncoding方法即可创建一个NSData类型的对象。然后才可以将这个NSData类型对象传入进行创建
具体过程,实例如下:首先创建一个要写入二进制文件的NSString对象
NSString *t=@“床前明月光,疑是地上霜。”;  转化为 ——>NSData对象
NSData *data=[t dataUsingEncoding:NSUTF8StringEncoding];
 isYES=[fm createFileAtPath: createDirPath  contens:data attributes: nil];
3)复制文件/文件夹
调用NSFileManager的copyItemAtPath:…  toPath… error:…  方法即可
例:[fm copyItemAtPath:createDirPath toPath:targetPath  error: nil];
4)移动文件/文件夹
调用NSFileManager对象的moveItemAtPath:…  toPath…  error:… 方法即可实现,举例如下:
[fm moveItemAtPath:createDirPath toPath:targetPath error:nil];
5)删除文件/文件夹
调用NSFileManager对象的removeItemAtPath:…  error:…   方法即可

例:[fm removeItemAtPath:targetPath  error:nil ]; 如果删除的是路径的话就会把最后一个文件夹给删掉(包括里面的所有文件和内容),如果targetPath的最后一部分是个“文件名.后缀” 即表示的是个文件的话则直接把文件删除

注意:
(一)创建,复制、移动、删除文件到新的路径时,新的路径的最后一部分必须是文件名加后缀,负责根本无法成功的执行创建、复制、移动、删除。
(二)另外创建文件的方法不会自动创建路径,创建路径的方法不会自动的创建文件,所以在执行对文件的操作(创建、复制、移动、删除)之前先判断新的路径是否缺失,如果缺失的话就无法创建文件,就需要创建文件所在的路径名。

(三)文件所在的路径就是把指定的文件目录去除最后一部分,就是去除文件名加文件后缀后的路径。可以使用文件目录对象调用NSString的一个对象方法stringByDeletingLastPathComponent对文件目录最后一部分执行去除后生成一个新的NSString对象,即文件所在路径。

(四)除了创建文件和创建目录必须用不同的方法,复制,移动和删除都可以用同样的方法即复制操作即可复制文件也可复制文件夹  移动操作既可移动文件也可移动文件夹(包含里面所有东西),删除也是一样。除了创建操作例外。

切记:无论是文件还是文件夹被操作后弄到新的位置,都要指定新的名称(也可与原来相同),例如文件被复制到新的位置那么新的位置最后一部分就要是新的文件名,如果是文件夹就要指定新的文件夹名。

5、NSFileManager用于文件下载
过程如下:
  步骤一:发送请求给服务器,要求下载某文件。
  步骤二:服务器发出相应,返回文件数据。
  步骤三:手机客户端利用NSData来存放服务器返回的文件数据。
  步骤四:利用NSFileManager将NSData里面的数据写到新的文件中。
即利用createFileAtPath方法。

文件管理类还有另外一个专门用于断点续传。

代码验证,实例如下:

编辑main.m如下:

//
//  main.m
//  NSFileManager
//
//  Created by apple on 15/8/21.
//  Copyright (c) 2015年 liu. All rights reserved.
//

#import <Foundation/Foundation.h>
void Test1()
{ // 创建NSFileManager对象并验证是单例对象
    NSFileManager *fm=[NSFileManager defaultManager];
    NSFileManager *fm1=[NSFileManager  defaultManager];
    NSLog(@"%@",fm); //<Person: 0x100304df0>
    NSLog(@"%@",fm1);  //<Person: 0x100304df0>
    [fm release];
    [fm release];
    NSLog(@"-----------------------------");
}
void Test2()
{  //用NSFileManager对象进行判断
    NSFileManager *fm=[NSFileManager defaultManager];   //  创建NSFileManager对象
    //  (一)判断文件是否存在
    NSString *filePath=[NSString stringWithFormat:@"%@/Desktop/1.txt",NSHomeDirectory()];  // 将判断是否创建路径存到NSString对象中
    BOOL isYES = [fm fileExistsAtPath:filePath];
    if(isYES){
        NSLog(@"此路径或文件存在");
    }else  NSLog(@"此文件或文件夹不存在");
    
    // (二) 判断是否是一个目录
    BOOL fool;
    if(isYES){ // 如果路径存在,执行判断是文件还是文件夹的操作
        [fm  fileExistsAtPath:filePath isDirectory:&fool];
        if (fool) {
            NSLog(@"是个目录");
        }else  NSLog(@"不是个目录,是个文件");
    }
    
    // (三)判断文件是否可读
    if (!fool) {  // 如果文件存在 不是目录,执行文件是否可读的操作
        BOOL isReadable= [fm isReadableFileAtPath:filePath];
        if (isReadable) {
            NSLog(@"此路径的文件是可读的");
        }else NSLog(@"此文件是不可读的");
    }
    
    //(四)判断文件是否可写
    if (!fool) {  // 如果文件存在 不是目录,执行文件是否可写的操作
        if ([fm isWritableFileAtPath:filePath]) {
            NSLog(@"此文件是可写的");
        }else  NSLog(@"此文件是不可写的");
    }
    //(五)判断文件是否可被删除
    if (!fool) {
        if ([fm isDeletableFileAtPath:filePath]) {
            NSLog(@"此文件是可以被删除的");
        }else NSLog(@"此文件是不可被删除的");
    }
    [fm release];
    NSLog(@"------------------------------");
    /*
     注意:NSFileManager类的对象在执行判断操作时调用的方法都是以"is"开头的
     */
}
void Test3()
{ // 利用NSFileManager对象来访问文件信息
    NSFileManager *fm = [NSFileManager defaultManager];
    NSString *filePath = @"/Users/apple/Desktop/1.txt";
    
    //(一)获取文件的属性  利用NSFilemanager对象的attributesOfItemAtPath方法返回一个属性字典
    NSDictionary *dict = [fm attributesOfItemAtPath:filePath error:nil];
    NSLog(@"输出文件的属性信息:%@",dict);
    NSLog(@"%@",dict[@"NSFileCreationDate"]);
    NSLog(@"%@",[dict  objectForKey:@"NSFileSize"]);
    
    //(二)获取指定目录及所有子目录下的文件及文件夹(包括后代) 返回一个NSArray类型数组
    NSString *filePath2=[NSString stringWithFormat:@"%@/Documents/a",NSHomeDirectory()];
    //方式一:使用递归的方式,调用subpathsAtPath
    NSArray *subPaths1 = [fm subpathsAtPath:filePath2];
    NSLog(@"%@",subPaths1);
    // 方式二:不是用递归的方式进行遍历
    NSArray *subPaths2=[fm subpathsOfDirectoryAtPath:filePath2 error:nil];
    NSLog(@"%@",subPaths2);
    
    //(三)获取指定目录下的子目录(不再获取后代目录)
    NSString *filePath3=[NSString stringWithFormat:@"%@/Documents/a",NSHomeDirectory()];
    NSArray *contentsOfPath=[fm contentsOfDirectoryAtPath:filePath3 error:nil];
    NSLog(@"%@",contentsOfPath);
    [fm release];
    NSLog(@"------------------------------");
}
void Test4()
{  //  调用NSManager对象的对象方法创建目录
    NSFileManager *fm=[NSFileManager defaultManager];
    
    //(一)创建一个目录 (不会创建文件,若文件后缀有文件则最后会创建一个以文件名加文件后缀的文件夹)
    NSString *createPath=[NSString stringWithFormat:@"%@/Desktop/a/bb/cc/dd",NSHomeDirectory()];
    BOOL isCreatePathSuc=[fm createDirectoryAtPath:createPath withIntermediateDirectories:YES attributes:nil error:nil];
    if (isCreatePathSuc) {// 创建目录方法中的withIntermediateDirectories表示当路径缺失时是否自动创建
        NSLog(@"指定目录创建成功");
    }else NSLog(@"指定目录未创建成功");
    [fm release];
    NSLog(@"------------------------------");
}
void Test5()
{ // 用NSManager对象调用对象方法对文件进行管理(创建,移动,复制,删除)
    NSFileManager *fm=[NSFileManager defaultManager];
    
    // (一)在指定的路径创建一个文件(如果文件的路径不存在,不会自动创建文件路径)
    NSString *createFilePath=@"/Users/apple/Desktop/a/bb/cc/rr/dd.txt"; //指定文件路径
    NSString *createPath=[createFilePath stringByDeletingLastPathComponent]; //获取文件所在路径
    if (![fm fileExistsAtPath:createPath]) { // 如果要创建的文件所在路径不存在,需要手动创建路径
        [fm createDirectoryAtPath:createPath withIntermediateDirectories:YES attributes:nil error:nil];// 手动创建路径
    }
    NSString *content=@"床前明月光,疑是地上霜。\n举头望明月,低头思故乡。";
    NSData *data=[content  dataUsingEncoding:NSUTF8StringEncoding];
    BOOL IScreateFileSuc = [fm createFileAtPath:createFilePath contents:data attributes:nil];
    if (IScreateFileSuc) {
        NSLog(@"文件创建成功");
    }else NSLog(@"文件没有创建成功");
    
    // (二)复制指定文件到新的路径(新的路径名后必须加文件名及其后缀名,不然无法复制)
    NSString *targetPath=[NSString stringWithFormat:@"%@/Desktop/s.txt",NSHomeDirectory()];
    BOOL isCopySuc=[fm copyItemAtPath:createFilePath toPath:targetPath  error:nil];
    if (isCopySuc) {
        NSLog(@"文件成功复制到指定位置");
    }else NSLog(@"文件未复制成功");
    
    
    // (三)移动文件到新的路径位置
    NSString *moveToNewPath=[NSString stringWithFormat:@"%@/Documents/s.txt",NSHomeDirectory()];
    BOOL isMoveSuc=[fm moveItemAtPath:targetPath toPath:moveToNewPath error:nil];
    if (isMoveSuc) {
        NSLog(@"文件成功移动到新的位置");
    }else  NSLog(@"文件没有成功复制到指定的位置");
    //(四)删除指定位置的文件
    BOOL isRemoveSuc=[fm removeItemAtPath:moveToNewPath error:nil];
    if (isRemoveSuc) {
        NSLog(@"文件移除成功");
    }else NSLog(@"文件未移出成功");
    [fm release];
    NSLog(@"------------------------------");
}
int main(int argc, const char * argv[])
{
    
    @autoreleasepool {
        Test1();
        Test2();
        Test3();
        Test4();
        Test5();
    }
    return 0;
}
运行结果如下:











































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值