【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常用方法
- 【IOS 开发学习总结-OC-34】★★文件 I/O——NSFileManager 管理文件和目录
- 【IOS 开发学习总结-OC-35】★文件 I/O——NSPathUtilities.h管理路径+NSProcessInfo获取进程信息
- 【IOS 开发学习总结-OC-36】★文件 I/O——NSFileHandle&NSURL&NSBundle
- 【IOS 开发学习总结-OC-37】★文件 I/O——对象归档
- iOS—— NSFileManager ——管理文件和目录
- iOS - OC NSFileManager文件管理
- 【IOS 开发学习总结-OC-33】★★objective-c之文件 I/O概述+NSData/NSMutableData
- 文件I/O、文件和目录学习总结
- NSFileManager管理文件和目录
- IOS管理文件和目录(NSFileManager用法)
- Objective-C NSFileManager 管理文件和目录
- IOS-文件管理NSFileManager
- IOS开发之OC篇(6)——NSFileManager文件管理器
- ios NSFileManager创建目录、文件
- iOS——(文件管理)NSFileManager的常用方法
- iOS文件管理 NSFileManager NSFileHandle
- iOS的文件管理NSFileManager
- iOS的文件管理NSFileManager
- C语言输入输出函数详解
- 诚实人和说谎者 -- truth teller and liar
- 校友会攻略
- 数据结构之单链表
- swift控件代码
- 【IOS 开发学习总结-OC-34】★★文件 I/O——NSFileManager 管理文件和目录
- 原子性和可见性
- 数据结构之静态链表
- UI高级第五课 网络通信——iOS学习连载33
- Ios66详解之地图定位失败错误信息处理
- 省市区3个tableView联动实现
- 手机应用推荐
- Python学习之正则表达式
- strcpy、memcpy、memmove的区别