您的位置:首页 > Web前端

NSFileManager Class Reference

2015-10-13 10:58 357 查看
NSFileManager是IOS的文件管理器,它可以帮助你获取IOS系统中文件的内容或对其修改。你可以使用它来定位、创建、复制、移动文件和目录,你还可以使用它来获取或修改有关文件和目录的相关信息。

NSFileManager是一个共享的文件管理器对象。如果你想以交互的方式监听文件的相关操作,你可以创建一个自己的实例,并为它指定一个代理。

你可以使用NSURL和NSString对象指定文件的位置。鉴于使用NSURL可以获取更多的信息,还可以使用它获得一个书签,推荐优先使用NSURL指定文件的位置。

如果你正在移动、复制和删除文件或目录,可以使用NSFileManagerDelegate代理监听这些操作,它可以帮助你在出错的时候,是否继续操作。

在OSX V10.7和IOS 5以后,NSFileManager支持管理ICloud上的文件。NSFileManager可以将IOS设备和Mac电脑上文件和目录同步到iCloud,这使得在一个位置上项目的变化可以传播到其他设备生。

NSFileManager是线程安全的。

本博文将介绍关于NSFileManager的一系列操作。如果你还不知道怎么获取IOS中特殊的文件夹,你可以先研读我的另一篇博文《 IOS沙盒目录》

创建NSFileManager

- init 


+ defaultManager

#pragma mark 创建NSFileManager
- (void)testCreatingFileManager {
NSFileManager *fileManager = [NSFileManager defaultManager];
// 或
fileManager = [[NSFileManager alloc] init];
}


获取系统目录

- URLForDirectory:inDomain:appropriateForURL:create:error: 


- URLsForDirectory:inDomains:

#pragma mark 获取系统目录
- (void)testLocatingSystemDirectories {

NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
// 定位和选择创建指定的常见的目录域
// 定位Library目录路径
NSURL *url = [fileManager URLForDirectory:NSLibraryDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:&error];
NSLog(@"app_home_lib:%@", url);

// tmp下创建临时目录
url = [fileManager URLForDirectory:NSItemReplacementDirectory inDomain:NSUserDomainMask appropriateForURL:[NSURL URLWithString:@"test"] create:YES error:&error];
NSLog(@"app_home_tmp:%@", url);

// 获取Library目录路径
NSArray *paths = [fileManager URLsForDirectory:NSLibraryDirectory inDomains:NSUserDomainMask];
NSLog(@"app_home_lib:%@", paths);

}


定位应用组目录

- containerURLForSecurityApplicationGroupIdentifier:

#pragma mark 定位应用组目录
- (void)testLocatingApplicationGroupContainerDirectories {
NSFileManager *fileManager = [NSFileManager defaultManager];
// 定位应用组目录,需在https://idmsa.apple.com/IDMSWebAuth/authenticate配置
NSURL *groupURL = [fileManager containerURLForSecurityApplicationGroupIdentifier:@"idebtufuer"];
NSLog(@"Application Group Container Directories:%@", groupURL);
}


目录内容

- contentsOfDirectoryAtURL:includingPropertiesForKeys:options:error:

- contentsOfDirectoryAtPath:error:

- enumeratorAtURL:includingPropertiesForKeys:options:errorHandler:

- enumeratorAtPath:

- mountedVolumeURLsIncludingResourceValuesForKeys:options:

- subpathsOfDirectoryAtPath:error:

- subpathsAtPath:

#pragma mark 目录内容
- (void)testDiscoveringDirectoryContents {

NSError *error;
NSFileManager *fileManager = [NSFileManager defaultManager];
// 获取应用沙盒下的目录路径
NSURL *appHomeDir = [NSURL URLWithString:NSHomeDirectory()];
NSArray *array = [fileManager contentsOfDirectoryAtURL:appHomeDir includingPropertiesForKeys:nil options:NSDirectoryEnumerationSkipsHiddenFiles error:&error];
NSLog(@"contentsOfDirectoryAtURL:%@", array);

// 获取应用沙盒下的文件或目录名
array = [fileManager contentsOfDirectoryAtPath:NSHomeDirectory() error:&error];
NSLog(@"contentsOfDirectoryAtPath:%@", array);

// 获取应用沙盒下的所有目录和文件路径
NSDirectoryEnumerator<NSURL *> *dirEnumerator = [fileManager enumeratorAtURL:appHomeDir includingPropertiesForKeys:nil options:NSDirectoryEnumerationSkipsHiddenFiles errorHandler:nil];
for (NSURL *theURL in dirEnumerator) {
NSLog(@"enumeratorAtURL:%@", theURL);
}

// 获取应用沙盒下的所有目录和文件的路径名
NSDirectoryEnumerator<NSString *> *dirEnum = [fileManager enumeratorAtPath:NSHomeDirectory()];
NSString *file;
while (file = [dirEnum nextObject]) {
NSLog(@"enumeratorAtPath:%@", file);
}

// 获取应用沙盒下的所有目录和文件的路径名
array = [fileManager subpathsAtPath:NSHomeDirectory()];
NSLog(@"subpathsAtPath:%@", array);

// 获取应用沙盒下的所有目录和文件的路径名
array = [fileManager subpathsOfDirectoryAtPath:NSHomeDirectory() error:&error];
NSLog(@"subpathsOfDirectoryAtPath:%@", array);

}


创建和删除

- createDirectoryAtURL:withIntermediateDirectories:attributes:error:

- createDirectoryAtPath:withIntermediateDirectories:attributes:error:

- createFileAtPath:contents:attributes:

- removeItemAtURL:error:

- removeItemAtPath:error:

- replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error:

#pragma mark 创建和删除
- (void)testCreatingAndDeletingItems {

NSError *error;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *documentURL = [fileManager URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:&error];// 获取Document路径
NSString *dirStr = [documentURL.path stringByAppendingPathComponent:@"directory"];
NSURL *dirUrl = [NSURL URLWithString:dirStr];

// 根据url路径创建
BOOL create = [fileManager createDirectoryAtURL:dirUrl withIntermediateDirectories:YES attributes:nil error:&error];
NSLog(@"createDirectoryAtURL:%d", create);

// 根据url路径删除
BOOL remove = [fileManager removeItemAtURL:dirUrl error:&error];
NSLog(@"removeItemAtURL:%d", remove);

// 根据string路径创建
create = [fileManager createDirectoryAtPath:dirStr withIntermediateDirectories:YES attributes:nil error:&error];
NSLog(@"createDirectoryAtPath:%d", create);

// 根据string路径创建
remove = [fileManager removeItemAtPath:dirStr error:&error];
NSLog(@"removeItemAtPath:%d", remove);

// 创建plist文件
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObject:@"YangJun" forKey:@"937447974"];
// 得到完整的文件名
NSString *filename = [documentURL.path stringByAppendingPathComponent:@"test.plist"];
// 写入
[dict writeToFile:filename atomically:YES];

// 文件路径替换
NSString *replaceStr = [documentURL.path stringByAppendingPathComponent:@"test1.plist"];
BOOL replace = [fileManager replaceItemAtURL:[NSURL URLWithString:replaceStr] withItemAtURL:dirUrl backupItemName:nil options:NSFileManagerItemReplacementUsingNewMetadataOnly resultingItemURL:nil error:&error];
NSLog(@"replaceItemAtURL:%d", replace);

// 清空
[fileManager removeItemAtPath:filename error:&error];
[fileManager removeItemAtPath:replaceStr error:&error];

}


移动和复制

- copyItemAtURL:toURL:error:

- copyItemAtPath:toPath:error:

- moveItemAtURL:toURL:error:

- moveItemAtPath:toPath:error:

#pragma mark 移动和复制
- (void)testMovingAndCopyingItems {

NSError *error;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *documentDireURL = [fileManager URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:&error];// Document目录路径

NSString *source = [documentDireURL.path stringByAppendingPathComponent:@"Source"];// 源路径
NSString *to = [documentDireURL.path stringByAppendingPathComponent:@"To"];// 目标路径

[fileManager createDirectoryAtPath:source withIntermediateDirectories:YES attributes:nil error:&error];// 创建文件夹

// 复制
BOOL copy = [fileManager copyItemAtPath:source toPath:to error:&error];
// 等价
// [fileManager copyItemAtURL:[NSURL URLWithString:source] toURL:[NSURL URLWithString:to] error:&error];
[fileManager removeItemAtPath:to error:&error];

// 移动
[fileManager moveItemAtPath:source toPath:to error:&error];
// 等价
// [fileManager moveItemAtURL:[NSURL URLWithString:source] toURL:[NSURL URLWithString:to] error:&error];
NSLog(@"copyItemAtPath:%d", copy);
NSLog(@"NSDocumentDirectory:%@", [fileManager subpathsAtPath:documentDireURL.path]);

}


iCloud管理

ubiquityIdentityToken Property

- URLForUbiquityContainerIdentifier:

- isUbiquitousItemAtURL:

- setUbiquitous:itemAtURL:destinationURL:error:

- startDownloadingUbiquitousItemAtURL:error:

- evictUbiquitousItemAtURL:error:

- URLForPublishingUbiquitousItemAtURL:expirationDate:error:

#pragma mark iCloud管理
- (void)testManagingICloudBasedItems {

// 需在项目中开启ICloud。Targets->Capabilities
NSError *error;
NSFileManager *fileManager = [NSFileManager defaultManager];
id ubiquityIdentityToken = fileManager.ubiquityIdentityToken;// ICloud的token
if (!ubiquityIdentityToken) {
NSLog(@"未登录iCLoud或项目未开启ICloud");
}

NSURL *iCloudUrl = [fileManager URLForUbiquityContainerIdentifier:nil];//iCloud 容器
NSLog(@"iCloud容器:%@", iCloudUrl);

BOOL isUbiquitousItemAtURL = [fileManager isUbiquitousItemAtURL:iCloudUrl];// 路径是否在iCloud上
NSLog(@"isUbiquitousItemAtURL:%d", isUbiquitousItemAtURL);

// 测试数据
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObject:@"YangJun" forKey:@"937447974"];
NSURL *documentDireURL = [fileManager URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:&error];// Document目录路径
NSString *fileUrlStr = [iCloudUrl.path stringByAppendingPathComponent:@"test.plist"];
[dict writeToFile:fileUrlStr atomically:YES]; // 输入写入

// 文件从本地移动到iCLoud 或 从iCLoud移动到本地
[fileManager setUbiquitous:YES itemAtURL:[NSURL URLWithString:fileUrlStr] destinationURL:[NSURL URLWithString:[iCloudUrl.path stringByAppendingPathComponent:@"test.plist"]] error:&error];

// 下载iCloud文件
[fileManager startDownloadingUbiquitousItemAtURL:[NSURL URLWithString:fileUrlStr] error:&error];

// 删除ICloud文件对应的本地副本
[fileManager evictUbiquitousItemAtURL:[NSURL URLWithString:fileUrlStr] error:&error];

// iCloud上的文件的分享地址,可以供其他人下载
NSURL *downloadUrl =  [fileManager URLForPublishingUbiquitousItemAtURL:[NSURL URLWithString:fileUrlStr] expirationDate:nil error:&error];

NSLog(@"NSDocumentDirectory:%@", [fileManager subpathsAtPath:documentDireURL.path]);
NSLog(@"iCloudUrl:%@", [fileManager subpathsAtPath:iCloudUrl.path]);

if (error) {
NSLog(@"%@", error.localizedDescription);
}

// 清理iCloud
NSDirectoryEnumerator<NSURL *> *dirEnumerator = [fileManager enumeratorAtURL:iCloudUrl includingPropertiesForKeys:nil options:NSDirectoryEnumerationSkipsHiddenFiles errorHandler:nil];
for (NSURL *theURL in dirEnumerator) {
[fileManager removeItemAtPath:theURL.path error:&error];// 删除
}

}


文件访问

- fileExistsAtPath:

- fileExistsAtPath:isDirectory:

- isReadableFileAtPath:

- isWritableFileAtPath:

- isExecutableFileAtPath:

- isDeletableFileAtPath:

#pragma mark 文件访问
- (void)testDeterminingAccessToFiles {

NSFileManager *fileManager  = [NSFileManager defaultManager];

BOOL fileExistsAtPath = [fileManager fileExistsAtPath:NSHomeDirectory()];// 文件是否存在
NSLog(@"是否存在:%d", fileExistsAtPath);

BOOL isDirectory = NO;// 是否系统文件
// 文件是否存在
fileExistsAtPath = [fileManager fileExistsAtPath:NSHomeDirectory() isDirectory:&isDirectory];
NSLog(@"是否存在:%d;系统文件:%d", fileExistsAtPath, isDirectory);

// 是否可读
BOOL isReadableFile = [fileManager isReadableFileAtPath:NSHomeDirectory()];
NSLog(@"是否可读:%d", isReadableFile);

// 是否可写
BOOL isWritableFile = [fileManager isWritableFileAtPath:NSHomeDirectory()];
NSLog(@"是否可写:%d", isWritableFile);

// 判断权限
BOOL isExecutableFile = [fileManager isExecutableFileAtPath:NSHomeDirectory()];
NSLog(@"是否有权限:%d", isExecutableFile);

// 是否可删除
BOOL isDeletableFile = [fileManager isDeletableFileAtPath:NSHomeDirectory()];
NSLog(@"是否可删除:%d", isDeletableFile);

}


获取和设置属性

- componentsToDisplayForPath:

- displayNameAtPath:

- attributesOfItemAtPath:error:

- attributesOfFileSystemForPath:error:

- setAttributes:ofItemAtPath:error:

#pragma mark 获取和设置属性
- (void)testGettingAndSettingAttributes {

NSError *error;
NSFileManager *fileManager  = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

// 路径分割
NSArray *array = [fileManager componentsToDisplayForPath:documentsDirectory];
NSLog(@"componentsToDisplayForPath:%@", array);

// 当前路径的文件或文件夹名
NSString *displayNameAtPath = [fileManager displayNameAtPath:documentsDirectory];
NSLog(@"displayNameAtPath:%@", displayNameAtPath);

// 获取文件属性
NSDictionary *itemAttributes = [fileManager attributesOfItemAtPath:documentsDirectory error:&error];
NSLog(@"attributesOfItemAtPath:%@",itemAttributes);

// 获取文件所处的系统存储空间使用情况
NSDictionary *fileAttributes = [fileManager attributesOfFileSystemForPath:documentsDirectory error:&error];
NSLog(@"attributesOfFileSystemForPath:%@",fileAttributes);

// 测试数据
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObject:@"YangJun" forKey:@"937447974"];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"test.plist"];
[dict writeToFile:filePath atomically:YES]; // 输入写入

// 属性设置
NSLog(@"%@", [fileManager attributesOfItemAtPath:filePath error:&error]);
[fileManager setAttributes:[NSDictionary dictionaryWithObject:@"1" forKey:NSFileExtensionHidden] ofItemAtPath:filePath error:&error];// 文件隐藏
NSLog(@"%@", [fileManager attributesOfItemAtPath:filePath error:&error]);

if (error) {
NSLog(@"错误:%@", error.localizedDescription);
}

}


获取和比较文件内容

- contentsAtPath:

- contentsEqualAtPath:andPath:

#pragma mark 获取和比较文件内容
- (void)testGettingAndComparingFileContents {

NSFileManager *fileManager  = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

// 测试数据
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObject:@"YangJun" forKey:@"937447974"];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"test.plist"];
[dict writeToFile:filePath atomically:YES]; // 输入写入

// 文件读取
NSData *data = [fileManager contentsAtPath:filePath];
NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];// NSData转NSString
NSLog(@"contentsAtPath:%@", jsonString);

// 文件内容比较
NSString *filePath1 = [documentsDirectory stringByAppendingPathComponent:@"test1.plist"];
[dict writeToFile:filePath1 atomically:YES]; // 输入写入
BOOL contents = [fileManager contentsEqualAtPath:filePath andPath:filePath1];
NSLog(@"contentsEqualAtPath:%d", contents);

}


文件之间的关系

- getRelationship:ofDirectoryAtURL:toItemAtURL:error:

- getRelationship:ofDirectory:inDomain:toItemAtURL:error:

#pragma mark 文件之间的关系
- (void)testGettingRelationshipBetweenItems {

NSError *error;
NSFileManager *fileManager  = [NSFileManager defaultManager];

NSURLRelationship outRelationship;
// 两个文件的关系
[fileManager getRelationship:&outRelationship ofDirectoryAtURL:[NSURL URLWithString:NSHomeDirectory()] toItemAtURL:[NSURL URLWithString:NSTemporaryDirectory()] error:&error];

// 文件和指定系统路径之间的关系
[fileManager getRelationship:&outRelationship ofDirectory:NSDocumentDirectory inDomain:NSUserDomainMask toItemAtURL:[NSURL URLWithString:NSTemporaryDirectory()] error:&error];

if (error) {
NSLog(@"错误:%@", error.localizedDescription);
}

}


文件路径转字符串

- fileSystemRepresentationWithPath:

- stringWithFileSystemRepresentation:length:

#pragma mark 文件路径转字符串
- (void)testConvertingFilePathsToStrings {

NSFileManager *fileManager = [NSFileManager defaultManager];

// 路径转char
const char *c = [fileManager fileSystemRepresentationWithPath:NSHomeDirectory()];

NSLog(@"fileSystemRepresentationWithPath:%s", c);

// 从char中获取指定长度的路径
NSString *s = [fileManager stringWithFileSystemRepresentation:c length:10];
NSLog(@"stringWithFileSystemRepresentation:%@", s);
}


当前目录管理

- changeCurrentDirectoryPath:

currentDirectoryPath Property

#pragma mark 当前目录管理
- (void)testManagingTheCurrentDirectory {

NSFileManager *fileManager = [NSFileManager defaultManager];

// 获取当前工作目录
NSLog(@"currentDirectoryPath:%@", fileManager.currentDirectoryPath);
// 改变当前工作目录到指定的文件夹
[fileManager changeCurrentDirectoryPath:NSHomeDirectory()];
NSLog(@"currentDirectoryPath:%@", fileManager.currentDirectoryPath);

}


访问文件属性

请研读我的另一篇文章 NSDictionary Class Reference

参考资料

NSFileManager Class Reference

修订历史

时间描述
2015-10-13根据IOS9的NSFileManagerAPI总结
2015-10-14增加访问文件属性的编程指南
版权所有:http://blog.csdn.net/y550918116j
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: