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常用方法