NSFileManager Class Reference

来源:互联网 发布:程序员专用昵称 编辑:程序博客网 时间:2024/06/04 22:31

        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

0 0