文件操作

1.对文件本身进行操作,使用NSFileManager

对于NSFileManager,文件或目录是使用文件的路径名的唯一标示。每个路径名都是一个NSString对象,它既可以是相对路径,也可以是绝对路径。相对路径是相对于当前的目录的路径名。绝对路径以/开始,斜线实际上就是一个目录称为根目录,例如:/Users/stevekochan,这个路径名指定了三个目录:/,Users和stevekochan。特殊的代字符(~)作为用户的主目录的缩写。其他特殊的UNIX风格的路径名字符,如表示当前目录“.”和表示父目录的“..”,需要在使用Foundation的文件处理方法之前将这些字符从路径明中移除。

代码展示:

#import<Foundation/Foundation.h>

#define PATH @"/Users/md101/Desktop"

#define ERROR(A) if(A){NSLog(@"%@",A);}

int main ()

{

   @autoreleasepool {

        //创建一个单例的NSFileManager对象

       NSFileManager *fm = [NSFileManagerdefaultManager];

        

       //查看指定目录下的文件和文件夹(浅度遍历)

       NSError *error = nil;

       NSArray *array = [fm  contentsOfDirectoryAtPath:PATHerror:&error];

       if (error) {

           NSLog(@"%@",error);

           exit(-1);

        }//文件操作需要报错

       NSLog(@"content of PATH:%@",array);

        

       //深度遍历 遍历指定目录下的所有文件的文件夹

        array = [fmsubpathsOfDirectoryAtPath:PATHerror:&error];

       if (error) {

           NSLog(@"%@",error);

           exit(-1);

        }

       NSLog(@"sub content of PATH:%@",array);

       

       //在指定目录创建新目录 Path要写全路径

       //第二个参数表示是否创建中间路径

       //第三个参数表示文件属性

        [fmcreateDirectoryAtPath: [NSStringstringWithFormat:@"%@/mildle/test1",PATH]withIntermediateDirectories:YES

           attributes:nilerror:&error];

       if (error) {

           NSLog(@"%@",error);

           exit(-1);

        }

        

       //在制定目录下创建文件

       //第二个参数表示文件的内容,当其参数为nil时表示创建时不传入内容

        [fmcreateFileAtPath:[NSStringstringWithFormat:@"%@/mildle/test1/testfile",PATHcontents:[@"hello "dataUsingEncoding:NSUTF8StringEncoding]attributes:nil];

        

       //删除目录和文件

      /* [fm removeItemAtPath:[NSString stringWithFormat:@"%@/mildle/test1/testfile",PATH]  error:nil];

        ERROR(error);*/

        

       //复制文件和目录

       //第一个参数是源文件或目录的路径

       //第二个参数是目的文件或目录的路径

        [fmcopyItemAtPath:[NSStringstringWithFormat:@"%@/mildle",PATH]toPath:[NSStringstringWithFormat:@"%@/mildle2",PATHerror:&error];

        

        

       //移动文件或者目录

        [fmmoveItemAtPath:[NSStringstringWithFormat:@"%@/mildle",PATH]toPath:[NSStringstringWithFormat:@"%@/mildle2/testfile2",PATHerror:&error];

    }

    

   return 0;

}


-(BOOL)removeFileAtPath: path error: err 删除一个文件
-(BOOL)movePath: from toPath: to error: err重命名或移动一个文件(to不能已经存在)
-(BOOL)copyPath:from toPath:to error: err 复制文件 (to不能存在) 
-(BOOL)contentsEqualAtPath:path1 andPath:path2    比较两个文件的内容 
-(BOOL)fileExistsAtPath:path    测试文件是否存在 
-(BOOL)isReadablefileAtPath:path 测试文件是否存在,且是否能执行读操作 
-(BOOL)isWritablefileAtPath:path 测试文件是否存在,且是否能执行写操作 
-(NSDictionary *)attributesOfItemAtPath:path  error: err  获取文件的属性 
-(BOOL)setAttributesOfItemAtPath:  attr  error: err                        更改文件的属性 
-(NSString *)currentDirectoryPath                      获取当前目录 
-(BOOL)changeCurrentDirectoryPath:path                更改当前目录 
-(BOOL)copyPath:from toPath:to error: err      复制目录结构,to不能已经存在 
-(BOOL)createDirectoryAtPath:path withIntermediateDirectories: (BOOL) flag attributes:attr    创建目录 
-(BOOL)fileExistsAtPath:path isDirectory:(BOOL *)flag       测试文件是否为目录 (flag存储结构yes/no) 
-(NSArray *)contentsOfDirectoryAtPath:path   error: err        列出目录的内容 
-(NSDirectoryEnumerator *)enumeratorAtPath:path  枚举目录的内容 
-(BOOL)removeItemAtPath:path error: err  删除空目录 
-(BOOL)moveItemPath:from toPath:to error: err    重命名或移动一个目录,to不能是已经存在的 
注释:-(BOOL)changeCurrentDirectoryPath:path                更改当前目录 ,相当于将文件指针从一个文件移到另一个文件,对另一个文件进行操作。
    其中attr表示文件的权限,属性字典允许你指定要创建的文件的权限,以便获取或者更改现有文件的信息。对于文件创建,如果将该参数指定为nil,该文件会被设置为默认权限。对于现有        文件,属性字典包括各种信息,如文件的所有者,文件的大小,文件的创建日期等。
枚举目录中的内容:
1.使用-(NSDirectoryEnumerator *)enumeratorAtPath:path 方法,一次可以枚举指定目录中的每个文件,默认情况下,如果其中一个文件为目录,那么也会递归枚举他的内容。在这个过程中,通过向枚举对象发送一条skipDescendants消息,可以动态阻止递归过程,从而不再枚举目录中的内容。
2.使用contentsOfDirectoryAtPath:path error: err方法可以枚举指定目录的内容,并在一个数组中返回文件列表,如果这个目录中的任何文件本身是一个目录,这个方法并不会枚举他的内容。
枚举代码如下:
- (NSString *)lastPathComponent       提取路径中的最后一个组成部分
- (NSString *)pathExtension     从路径中最后一个组成部分中提取扩展名
- (NSString *)stringByAppendingPathComponentNSString *)path     将path添加到现有路径末尾
- (NSString *)stringByAppendingPathExtensionNSString *)ext       将指定的扩展名添加到现有路径的最后一个组成部分上
- (NSString *)stringByDeletingLastPathComponent      删除路径中的最后一个组成部分
- (NSString *)stringByDeletingPathExtension       从文件的最后一部分删除扩展名
- (NSString *)stringByExpandingTildeInPath        将路径中的代字符扩展成用户主目录(~)或指定用户的主目录(~user)
- (NSString *)stringByResolvingSymlinksInPath      尝试解析路径中的符号链接
- (NSString *)stringByStandardizingPath   解析路径中的~,(..)父目录,(.)当前目录和符号链接来标准化路径.
常用的路径工具函数:
NSString * NSUserName (void);· ··············································
NSString * NSFullUserName (void);
返回当前用户的完整用户名
NSString * NSHomeDirectory (void);
返回当前用户主目录的路径
NSString * NSHomeDirectoryForUser ( NSString *userName)
返回用户userName的主目录
NSString * NSTemporaryDirectory (void);
返回可用于创建临时文件的路径目录
代码如下:
代码展示及说明:
这里需要注意,只为方法-(BOOL)movePath: from toPath: to error: err和-(BOOL)copyPath:from toPath:to error: err指定目标目录,并不能够将文件或复制到这个目录中,必须明确的制定目标目录中的文件名。 在执行复制,重命名或移动操作的时候,目标文件不能是已经存在的,否则,操作将会失败。
-(NSDate *)contentsAtPath:path                从文件中读取数据,如果读取成功,这个方法返回存储区对象作为结果。否则将返回nil,(例如该文件不存在或者不能够读取)
+ (NSProcessInfo *)processInfo
返回当前进程信息
- (NSArray *)arguments
以NSString对象数字的形式返回当前进程的参数
- (NSDictionary *)environment
返回变量/值对字典,以描述当前的环境变量(比如PATH等等)
- (int)processIdentifier
返回进程PID
- (NSString *)processName
返回当前正在执行的进程名称
- (NSString *)globallyUniqueString
每次调用该方法时,都会返回不同的单值字符串,可以生成临时文件名
- (NSString *)hostName
返回主机系统名
- (NSUInteger)operatingSystem
返回表示操作系统的数字
- (NSString *)operatingSystemName
返回操作系统的名称
- (NSString *)operatingSystemVersionString
返回操作系统版本
- (void)setProcessName: (NSString *)name
修改当前进程名(谨慎使用)
代码说明:

常见的NSFileManager文件方法:

-(NSDate *)contentsAtPath:path                从文件中读取数据

-(BOOL)createFileAtPath:path contents:(NSDate *)data attributes:attr      向一个文件写入数据

常见的NSFileManager目录方法:

        NSFileManager *fm = [NSFileManagerdefaultManager];

        NSString *path = [fmcurrentDirectoryPath];

        NSLog(@"%@",path);

        NSDirectoryEnumerator *dictenum = [fmenumeratorAtPath:PATH];

        BOOL flag;

        while ((path = [dictenum nextObject])!=nil) {

            [fm fileExistsAtPath:PATHisDirectory:&flag];

            if (flag == YES) {

                [dictenum skipDescendants];

            }

            NSLog(@"%@",path);

}

使用路径

NSPathUtilities.h包含了NSString的函数和分类扩展,它允许你操作路径名。应该尽可能使用这些函数,以便使程序更独立于文件系统结构及特定文件和目录位置。

常用的路径处理方法:

+ (NSString *)pathWithComponentsNSArray *)components    根据components中的元素来构建路径.

- (NSArray *)pathComponents        析构路径,返回构成路径的各个部分.

···············返回当前用户的登录名

你可能还想查看Foundation函数NSSearchPathForDirectoriesInDomains(),它可用于查找系统的特殊目录,如果Application和Document目录。例如,定义一个方法saveFilePath,他返回文件saveFile在Document目录中的路径,这个方法可以用于应用程序里保存一些数据到一个文件中。

-(NSString *) saveFilePath

{

NSArray *dirList = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomairMask,YES);

//函数NSSearchPathForDirectoriesInDomains()的第一个参数是指定需要查找目录的路径,第二个参数可以是多个值,用于指定需要列出的目录,如用户的,系统的或者所有目录。最后一个参数用于用于指定是否展开路径中的~字符。该函数返回一组路径的数组。如果第二个参数指定多个值,该数组会包含多个元素。

NSString *docDir = [dirList objectAtIndex: 0];

return [docDir stringByAppendingPathComponent :@"saveFile"];

}

为了保存数据到下一次程序运行时仍能够继续使用,可以使用Document目录。每个iOS应用程序都有自己的Document目录供数据写入。

常用iOS目录:

Documents(NSDocumentDirectory)  //用于写入应用相关数据文件的目录,在ios中写入这里的文件能够与iTunes共享并访问,存储在这里的文件会自动备份到云端

Library/Caches(NSCachesDirectory)  //用于写入应用支持文件的目录,保存应用程序再次启动需要的信息。iTunes不会对这个目录的内容进行备份

tmp(use NSTemporaryDirectory())  //这个目录用于存放临时文件,只程序终止时需要移除这些文件,当应用程序不再需要这些临时文件时,应该将其从这个目录中删除

Library/Preferences  //这个目录包含应用程序的偏好设置文件,使用 NSUserDefault类进行偏好设置文件的创建、读取和修改

NSString *fName =@"path.m";

        NSFileManager *fm;

        NSString *path,*tempdir,*extension,*homedir,*fullpath;

        NSArray *components;

        fm = [NSFileManagerdefaultManager];

        // 获取临时工作目录

        tempdir  = NSTemporaryDirectory();

        NSLog(@"TemporaryDictionary is %@",tempdir);

        //从当前目录中提取基本目录

        path = [fm currentDirectoryPath];

        NSLog(@"Base dir is %@",[pathlastPathComponent]);

        //创建文件fName在当前目录的完整路径

        fullpath = [path stringByAppendingPathComponent:fName];

        NSLog(@"fullpath to %@ is %@",fName,fullpath);

        //获取文件的扩展名

        extension = [fullpath pathExtension];

        NSLog(@"extensize for %@ is %@",fullpath,extension);

        //获取用户的主目录

        homedir = NSHomeDirectory();

        NSLog(@"your home derectory is %@",homedir);

        //拆分路径为各组成分

        components= [fullpath pathComponents];

        for(path in components)

        {

            NSLog(@"%@",path);

        }

这里注意:NSTemporaryDirectory()返回系统中可以用来创建临时文件的目录路径名,如果在这个目录中创建临时文件,一定要在完成任务后将它们删除,另外确保文件名是唯一的。特别是在应用程序的多个实例同时在运行时更应该如此。如果多个用户登陆到系统,并且同时运行同一个应用程序,这种情况就很容易发生。如果你创建的临时文件并未删除,系统将会为你删除,然而最好不要依靠系统来删除,而是自己删除。

- (NSString *)lastPathComponent       提取路径中的最后一个组成部分,当你有绝对路径并且想从中获取基本文件名时,可以使用它。

- (NSString *)stringByAppendingPathComponentNSString *)path     将path添加到现有路径末尾,如果指定为接收者的路径名不是以斜线结束,那么该方法将在路径名中插入一条斜线,将路径名和附加的文件名分开。

- (NSString *)pathExtension     从路径中最后一个组成部分中提取扩展名,如果所给的文件没有扩展名,那么方法仅仅返回一个空字符串。

NSHomeDirectory()函数返回当前用户的主目录。使用NSHomeDiretoryForUser函数,同时提供用户名作为函数的参数,可以获得任何特定用户的主目录。

复制文件和使用NSProcsessInfo类

常用的NSProcessInfo类方法:

NSFileManager *fm;

        NSString *source,*dest;

        BOOL isDir;

        NSProcessInfo *proc = [NSProcessInfo processInfo];

        NSArray *args = [proc arguments];

        fm = [NSFileManager defaultManager];

        //检查命令行中的两个参数

        if ([args count ]!= 3) {

            NSLog(@"Usage : %@ src dest ",[proc processName]);

        }

        source = [args objectAtIndex:1];

        dest = [args objectAtIndex:2];

        NSLog(@"%@    %@",source,dest);

        //确定能够读取源文件

        if ([fm isReadableFileAtPath:source] ==NO) {

            NSLog(@"Can't read %@",source);

            return 2;

        }

        //目标文件是否是一个目录

        //若是,添加源到目标结尾

        [fm fileExistsAtPath:dest isDirectory:&isDir];

        if (isDir == YES) {

            dest = [dest stringByAppendingPathComponent:[source lastPathComponent]];

        }

        //若目标文件已经存在,则删除文件

        [fm removeItemAtPath:dest error:NULL];

        //好了,执行复制

        if ([fm copyItemAtPath:source toPath:dest error:NULL]==NO)

        {

            NSLog(@"Copy failed!");

            return 3;

        }

        NSLog(@"Copy of %@ to %@ succeeded!",source,dest);

2.对文件内容进行操作,使用NSHandle

使用文件时,需要频繁的将数据读入到一个一个临时数据区,这个时候临时存储区通常称为缓冲区。当收集数据,以便随后将这些数据输出到文件中,通常也使用存储区。Foundation的NSData类提供了一种简单的方式,它用来设置缓冲区,将文件的内容读入缓冲区,或将缓冲区的内容写到一个文件中。

常用的NSFileHandle方法:

常用NSFileHandle方法
+(NSFileHandle *)fileHandleForReadingAtPath:path                        打开一个文件准备读取
+(NSFileHandle *)fileHandleForWritingAtPath:path                        打开一个文件准备写入
+(NSFileHandle *)fileHandleForUpdatingAtPath:path                        打开一个文件准备更新(读取和写入)
-(NSData *)availableData                                                  从设备或通道返回可用数据
-(NSData *)readDataToEndOfFile                                            读取其余的数据直到文件末尾(最多UINT_MAX字节)
-(NSData *)readDataOfLength:(unsigned int)bytes 从文件读取指定数目bytes的内容
-(void)writeData:data                  将data写入文件
-(unsigned long long) offsetInFile      获取当前文件的偏移量
-(void)seekToFileOffset:offset         设置当前文件的偏移量 
-(unsigned long long) seekToEndOfFile      将当前文件的偏移量定位的文件末尾
-(void)truncateFileAtOffset:offset        将文件的长度设置为offset字节
-(void)closeFile                           关闭文件



有两个操作,分别为读操作写操作

代码展示及说明:

#import <Foundation/Foundation.h>

#define PATH @"/Users/md101/Desktop"

#define ERROR(A) if(A){NSLog(@"%@",A);}

int main ()

{

    @autoreleasepool {



        /*NSFileManager *fm = [NSFileManager defaultManager];

        [fm createFileAtPath:[NSString stringWithFormat:@"%@/testfile/file",PATH]  contents:[@"hello word!"dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];

        

        

        

        //以只读方式打开文件生成文件句柄

        NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:@"/Users/md101/Desktop/testfile/file"];

        //从文件中读取三个字节的内容

        NSData *date1 = [handle readDataOfLength:3];

        NSString *str = [[NSString alloc] initWithData:date1 encoding:NSUTF8StringEncoding];

        NSLog(@"%@",str);

        

        //接着从上一次读过的字节数之后继续读5个字节

        date1 = [handle readDataOfLength:5];

        str = [[NSString alloc] initWithData:date1 encoding:NSUTF8StringEncoding];

        NSLog(@"%@",str);

        

        //一次性从上一次的文件指针到文件尾将文件的所有内容全部读入

        NSData *date1 = [handle readDataToEndOfFile];

        NSString *str = [[NSString alloc] initWithData:date1 encoding:NSUTF8StringEncoding];

        NSLog(@"%@",str);*/

        

        

       //以只写方式打开文件

       //此时文件的内容并没有像C语言中那样删除,也并不会在已有内容之后继续写入内容

       NSFileHandle *handle = [NSFileHandlefileHandleForWritingAtPath:@"/Users/md101/Desktop/testfile/file"];

       //将文件的内容截短至0字节,以便清空文件的内容

       //[handle truncateFileAtOffset:0];

        

       //将读写指针设置到文件尾,以便实现追加写操作

        [handleseekToEndOfFile];


        [handlewriteData:[@"hello"dataUsingEncoding:NSUTF8StringEncoding]];

        

    }

    

   return 0;

}

使用NSURL类

NSURL类提供在应用中使用URL地址的相关的方法。例如:给出映射到互联网上的一个文件路径的HTTP地址,调用一些方法就很容易读取这些文件的内容。NSURL对象并不是一个字符串(比如:@“http:/www.apple.com”),但是使用URLWithString:方法可以有一个字符串对象创建出NSURL对象。

//从网页上读取代码

NSURL *myURL = [NSURL URLWithString:@"http://www.baidu.com/"];

        NSString *myHomePage = [NSString stringWithContentsOfURL:myURL encoding:NSASCIIStringEncoding error:NULL];

        NSLog(@"%@",myHomePage);

如果词典作为属性列表存储在一个网址上,使用 dictionaryWithContentsOfURL:(NSURL *) 方法同样可以读取,或者数组存储在属性列表,可以使用 arrayWithContentsOfURL:(NSURL *)方法。如果希望从一个网站中读取任何一个数据类型,可以使用dataWithContentOfURL:方法。

使用NSBundle类

当创建一个应用时,系统存储了应用的相关联的所有数据(包括图片,本地化字符串和图标等),将这些内容放入一个成为应用包。为了访问应用中这些资源,需要熟悉NSBnudle类。

下面语句能够返回存储在应用包中得instructions.txt文件路径:

NSString *txtFilePath = [[NSBundle mainBundle] pathforResource: @"instructions"ofType:@"txt"];

mainBundle方法给出了应用包所在的目录。pathforResource:ofType:方法会列出该目录指定的文件并返回文件路径,随后就可以读取文件内容到程序中:

NSString * instructions = [NSString stringWithContentsOfFile:txtFilePath encoding:NSUTF8StringEncoding error:NULL];

如果希望列出在应用包中的图片目录中所有以jpg为文件后缀名的JPEG图片,需要使用到pathsForResourcesOfType: inDirectory:方法:

NSArray * birds = [NSBundle mainBundle]pathsForResourcesOfType:@"jpg" inDirectory:@"birdImages"];

这个方法返回路径名的数组。如果JPEG图片并未存储在应该的子目录中,inDirectory :的参数可以指定为@“”。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值