【IOS 开发学习总结-OC-34】★★文件 I/O——NSFileManager 管理文件和目录

来源:互联网 发布:mac eclipse 编辑:程序博客网 时间:2024/04/30 06:53

NSFileManager代表文件管理器。当开发者使用NSFileManager执行移动 ,复制,链接,删除文件或目录 时,程序可以为 NSFileManager提供配套的事件委托(实现了 NSFileManagerDelegate 协议的对象),该委托对象用于 确保移动 ,复制,链接,删除操作的成功过完成,并为前面的几种操作提供相应的处理方法。

NSFileManager采用文件名作为文件的唯一标识。每个文件名都是一个普通的 NSString 对象,它既可是 绝对路径,也可以是相对路径。

(Mac 系统下的)绝对路径与相对路径

相对路径:不以斜线开头的路径 都是相对路径。如,code/abc.m 代表,当前路径下code目录下的 abc.m 文件。相对路径都是以当前路径作为基础路径。——随着当前路径的变化,同一个相对路径实际代表的文件可能发生变化,,在终窗口输入 pwd 命令,既可看到 当前路径。
绝对路径:以 斜线(代表 根目录)开头的路径。绝对路径是唯一的 。它代表的文件/目录总是固定的。比如:/Users/abc,代表根目录下Users目录下的 abc 子目录。

MAC OS X 中 包括的几种特殊路径:

~:代表当前用户的Home 目录。for example:
- 当前用户为 albert, 那么~就代表 /Users/ albert;
- 还可以写成 :~xyz,代表 xyz 用户的 Home 目录 ,即 /Users/ xyz;

.:代表当前目录。
..: 代表当前目录的上一级目录。

NSFileManager访问文件属性 和内容

程序可以调用NSFileManager的defaultManager 类方法来获取系统默认的NSFileManager对象,一旦获取了NSFileManager对象,,就可以调用NSFileManager的方法操作系统的文件项目。

示例代码:
NSFileManagerTest.m

#import <Foundation/Foundation.h>int main(int argc , char * argv[]){    @autoreleasepool{        NSFileManager* fm = [NSFileManager defaultManager];        // 将会输出代表真的1        NSLog(@"NSFileManagerTest.m是否存在:%d",             [fm fileExistsAtPath:@"NSFileManagerTest.m"]);        BOOL isDir;        NSLog(@"NSFileManagerTest.m是否存在:%d",             [fm fileExistsAtPath:@"NSFileManagerTest.m"            isDirectory: &isDir]);        // 将会输出代表假的0        NSLog(@"NSFileManagerTest.m是否为目录:%d", isDir);        // 将会输出代表真的1        NSLog(@"NSFileManagerTest.m是否为可读文件:%d",             [fm isReadableFileAtPath:@"NSFileManagerTest.m"]);        // 将会输出代表真的1        NSLog(@"NSFileManagerTest.m是否为可写文件:%d",             [fm isWritableFileAtPath:@"NSFileManagerTest.m"]);        // 将会输出代表假的0        NSLog(@"NSFileManagerTest.m是否为可执行文件:%d",             [fm isExecutableFileAtPath:@"NSFileManagerTest.m"]);        // 将会输出代表真的1        NSLog(@"NSFileManagerTest.m是否为可删除文件:%d",             [fm isDeletableFileAtPath:@"NSFileManagerTest.m"]);         // 获取NSFileManagerTest.m文件所在的路径组件        NSArray* array = [fm componentsToDisplayForPath:            @"NSFileManagerTest.m"];        NSLog(@"--NSFileManagerTest.m所在路径的完整路径组件为:--");        for(NSObject* ele in array)        {            NSLog(@"%@ , " , ele);        }        // 获取文件的相关属性        NSDictionary* attr = [fm attributesOfItemAtPath:@"NSFileManagerTest.m"            error:nil];        // 获取文件属性的详情        NSLog(@"NSFileManagerTest.m的创建时间为:%@",            [attr fileCreationDate]);        NSLog(@"NSFileManagerTest.m的属主账户为:%@",            [attr fileOwnerAccountName]);        NSLog(@"NSFileManagerTest.m的文件大小为:%lld",            [attr fileSize]);        // 直接获取文件内容        NSData* data = [fm contentsAtPath:@"NSFileManagerTest.m"];        // 直接将NSData的数据用UTF-8的格式转换字符串        NSString* content = [[NSString alloc] initWithData:data             encoding:NSUTF8StringEncoding];        NSLog(@"----------输出文件内容---------");        NSLog(@"%@" , content);    }}

NSFileManager的创建,删除,移动,复制等

上面的代码中包括但不全包括如下方法 :
1. fileExistsAtPath:——判读文件名对应的文件是否存在。
2. fileExistsAtPath:<#(nonnull NSString *)#> isDirectory:<#(nullable BOOL *)#>——判读文件名对应的文件或目录是否存在,该方法 的后一个参数 用于 返回该文件名是否为目录/文件夹。
3. isReadableFileAtPath:<#(nonnull NSString *)#>——判断指定目录下的文件是否可读。
4. isWritableFileAtPath:<#(nonnull NSString *)#>——判断指定目录下的文件是否可写。
5. isExecutableFileAtPath:(nonnull NSString *)——判断指定目录下的文件是否可执行
6. isDeletableFileAtPath:<#(nonnull NSString *)#>——判断指定目录下的文件是否可删除
7. componentsToDisplayForPath:<#(nonnull NSString *)#>——获取指定文件名对应 文件的 各个 路径组件。
8. displayNameAtPath:<#(nonnull NSString *)#>——获取 指定文件名对应文件的简单文件名
9. attributesOfFileSystemForPath:<#(nonnull NSString *)#> error:——获取指定文件名对应的 文件所在文件系统的属性。
10. attributesOfItemAtPath:<#(nonnull NSString *)#> error:——获取指定文件名对应 文件的属性
11. setAttributes:<#(nonnull NSDictionary<NSString *,id> *)#> ofItemAtPath:<#(nonnull NSString *)#> error:——设置指定文件名对应文件的属性。
这里写图片描述
12. contentsAtPath:<#(nonnull NSString *)#>——获取指定文件名对应文件的内容。
13. contentsEqualAtPath:<#(nonnull NSString *)#> andPath:<#(nonnull NSString *)#>——判断2个文件名指定的文件内容是否相同。
14. subpathsAtPath:<#(nonnull NSString *)#>——获得文件夹下的所有文件夹,递归读取
这里写图片描述
15. subpathsOfDirectoryAtPath:<#(nonnull NSString *)#> error:<#(NSError * _Nullable __autoreleasing * _Nullable)#>——非递归获取文件夹下的文件夹,深度遍历目录
16. - (NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error——浅度遍历目录
这里写图片描述
17. - (NSString *)currentDirectoryPath——获取当前目录
18. - (BOOL)changeCurrentDirectoryPath:(NSString *)path——更改当前目录
19. - (NSDirectoryEnumerator *)enumeratorAtPath:(NSString *)path——枚举目录内容,获取指定目录下所有文件和子目录对应的枚举器,如果指定目录下的文件是子目录,该方法默认会递归子目录中所有的内容。(程序可以调用 NSDirectoryEnumerator 方法来阻止递归枚举子目录)
20. - (BOOL)createDirectoryAtPath:<(NSString *)path > withIntermediateDirectories:<(BOOL)createIntermediates> attributes:<(NSDictionary *)attributes> error:<(NSError **)error>——创建目录/文件夹
这里写图片描述
21. - (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)contents attributes:(NSDictionary *)attributes——创建文件 (事先需要一个NSData),例如:

NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
[fileManager createFileAtPath:[NSString stringWithFormat:@”%@/1.txt”,path] contents:data attributes:nil];


22. - (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error——复制文件/目录
示例:[fileManager copyItemAtPath:[NSString stringWithFormat:@"%@/1.txt",path] toPath:[NSString stringWithFormat:@"%@/bbb/1.txt",path] error:nil];
23. - (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error——移动/重命名文件或者目录
文件移动 文件夹不存在刚会失败 不会新建文件夹,例如:
[fileManager moveItemAtPath:[NSString stringWithFormat:@"%@/1.txt",path] toPath:[NSString stringWithFormat:@"%@/ddd/1.txt",path] error:nil];
24. - (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error——删除文件/目录
25. contentsOfDirectoryAtPath:<#(nonnull NSString *)#> error:——获取指定目录下的所有文件和子目录,对于指定目录下的子目录,该方法不会进行递归枚举。
示例代码1:

#import <Foundation/Foundation.h>int main(int argc , char * argv[]){    @autoreleasepool{        NSFileManager* fm = [NSFileManager defaultManager];        // 创建目录        [fm createDirectoryAtPath:@"xyz/abc"            // 该参数指定如果父目录不存在,创建父目录            withIntermediateDirectories:YES            attributes:nil             error:nil];        NSString* content = @"《疯狂iOS讲义》是我正在学习的图书!";        // 创建一份文件        [fm createFileAtPath:@"myInfo.txt"            contents:[content dataUsingEncoding:NSUTF8StringEncoding]            attributes:nil];        // 复制一份新文件        [fm copyItemAtPath:@"myInfo.txt"            toPath:@"copyInfo.txt"            error:nil];    }}

示例代码2:

#import <Foundation/Foundation.h>int main(int argc , char * argv[]){    @autoreleasepool{        NSFileManager* fm = [NSFileManager defaultManager];        // 获取指定目录下所有文件和文件夹        NSArray * array = [fm contentsOfDirectoryAtPath:@"."            error:nil];        for(NSString* item in array)        {            NSLog(@"%@" , item);        }        // 获取指定目录下所有文件和文件夹对应的枚举器        NSDirectoryEnumerator* dirEnum =            [fm enumeratorAtPath:@"."];        NSString *file;        // 枚举dirEnum中包含的每个文件        while ((file = [dirEnum nextObject]))         {            // 如果该文件的文件名以.m结尾            if ([[file pathExtension] isEqualToString: @"m"]) {                // 直接获取文件内容                NSData* data = [fm contentsAtPath:file];                // 直接将NSData的数据用UTF-8的格式转换字符串                NSString* content = [[NSString alloc] initWithData:data                     encoding:NSUTF8StringEncoding];                NSLog(@"----------输出文件内容---------");                NSLog(@"%@" , content);            }        }        // 获取当前目录下的所有子目录//      NSArray* subArr = [fm subpathsOfDirectoryAtPath:@"." //          error:nil];//这个方法与下面的方法作用一样,用哪个都行        NSArray* subArr = [fm subpathsAtPath:@"."];        for(NSString* item in subArr)        {            NSLog(@"%@" , item);        }    }}

补充参考资料:
1. 文件管理类NSFileManager常用操作 ,其中 包含了NSFileHandle类和NSFileManager类的常用操作。
2. IOS中级篇 —— NSFileManager常用方法

0 0
原创粉丝点击