OC语言--NSFileManager& NSFileHandle

1.关于文件的介绍

-》什么是文件:

文件概念, 广义文件, 狭义文件(磁盘文件), 

文件常见的使用操作(可用命令行演示文件操作的使用场景)。

-》什么是路径:

简单来说就是,在系统中,要找某个文件,所要经历的目录阶梯。

2. 文件管理类 NSFileManager(系统类库

-》NSFileManager是一个单例类 (对于一个单例类,不论实例化对象多少次,都只有一个对象实例,而且这个实例是全局的,能被整个系统访问到, 就像全局变量一样可以被整个工程所共享它的数据。)

要对文件进行管理,必须要先获取文件管理器

(NSFileManager类)的对象

  NSFileManager* fm = [NSFileManager defaultManager];

-》对文件进行管理的各种操作:

a. 遍历目录下的文件(目录下的文件名列表)(查)

b. 创建文件或目录(增)

c. 拷贝文件或目录(增)

d. 移动文件或目录(改)

e. 删除文件或目录(删)

-》创建文件管理器单例对象

NSFileManager * fm = [NSFileManager defaultManager];

-》遍历目录下的内容

//浅度遍历

- (NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;

//深度遍历

- (NSArray *)subpathsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;

-》创建文件

//创建普通文件

- (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)attr;

//创建目录

- (BOOL)createDirectoryAtPath:(NSString *)path 

withIntermediateDirectories:(BOOL)createIntermediates 

attributes:(NSDictionary *)attributes   

error:(NSError **)error;

-》拷贝文件/目录

- (BOOL)copyItemAtPath:(NSString *)srcPath 

toPath:(NSString *)dstPath 

error:(NSError **)error;

-》移动文件/目录

- (BOOL)moveItemAtPath:(NSString *)srcPath 

toPath:(NSString *)dstPath 

error:(NSError **)error;

-》删除文件/目录

- (BOOL)removeItemAtPath:(NSString *)path 

error:(NSError **)error;

-》获取文件属性//文件的元信息

- (NSDictionary *)attributesOfItemAtPath:(NSString*)path

error:(NSError **)error;

-》判断文件是否存在

- (BOOL)fileExistsAtPath:(NSString *)path;

拓展: 单例模式

(1)单例模式是一种常用的设计模式。

在应用这个模式时,单例对象的类必须保证只有一个实例存在,而且自行实例化并向整个系统提供这个实例。

也就是说,对于一个单例类,不论实例化对象多少次,都只有一个对象实例,而且这个实例是全局的,能被整个系统访问到, 就像全局变量一样可以被整个工程所共享它的数据。

(2)非标准的单例设计(单例模式的一种可选实现)

单例的创建方法通常以default或shared前缀开头

+ (MyPlane *)defaultPlane{

//或者 + (MyPlane *)sharedPlane{

 

    static MyPlane * plane = nil;

 

    @synchronized(self){

           if (!plane) {

            plane = [[self alloc] init];

           }

    }

    return plane;

}

 eg.示例代码

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

  @autoreleasepool {
    NSArray* myDirAarry = nil;
    
      //创建文件管理器的单例对象
    NSFileManager* fm = [NSFileManager defaultManager];
      //浅度遍历
    myDirAarry = [fm contentsOfDirectoryAtPath:@"/Users/sub/Desktop/" error:nil];
    NSLog(@"%@",myDirAarry);
      //深度遍历
    myDirAarry=[fm subpathsOfDirectoryAtPath:@"/Users/sub/Desktop" error:nil];
    NSLog(@"%@",myDirAarry);
    
    [fm createFileAtPath:@"/Users/sub/Desktop/haha.txt" contents:nil attributes:nil];
    
    [fm createDirectoryAtPath:@"/Users/sub/Desktop/testdir" withIntermediateDirectories:NO attributes:nil error:nil];
      //再次进行浅度遍历
    myDirAarry = [fm  contentsOfDirectoryAtPath:@"/Users/sub/Desktop/" error:nil];
    NSLog(@"%@",myDirAarry);
      //拷贝文件
    [fm copyItemAtPath:@"/Users/sub/Desktop/test.txt" toPath:@"/Users/sub/Desktop/test.rtf" error:nil];
      //再次进行浅度遍历
    myDirAarry = [fm  contentsOfDirectoryAtPath:@"/Users/sub/Desktop/" error:nil];
    NSLog(@"%@",myDirAarry);
      //移动文件
    [fm moveItemAtPath:@"/Users/sub/Desktop/test.txt" toPath:@"/Users/sub/Desktop/testdir/test.txt" error:nil];
      //再次进行深度遍历
    myDirAarry = [fm  subpathsOfDirectoryAtPath:@"/Users/sub/Desktop/" error:nil];
    NSLog(@"%@",myDirAarry);
      //获取指定文件的属性信息
    NSDictionary* fileAttributesInfo = [fm attributesOfItemAtPath:@"/Users/sub/Desktop/test.rtf" error:nil];
    NSLog(@"%@",fileAttributesInfo);
    if ([fm fileExistsAtPath:@"/Users/sub/Desktop/testdir/test.rtf"]) {
      [fm removeItemAtPath:@"/Users/sub/Desktop/testdir/test.rtf" error:nil];
    }else{
      NSLog(@"No such file");
    }
      //再次进行深度遍历
    myDirAarry = [fm  subpathsOfDirectoryAtPath:@"/Users/sub/Desktop/" error:nil];
    NSLog(@"%@",myDirAarry);

    NSDictionary*  dic = [fm attributesOfItemAtPath:@"/Users/sub/Desktop/test.rtf" error:nil];
    
    NSLog(@"%@",[dic objectForKey:@"NSFileType"]);

    
    
  }
    return 0;
}

3. 文件句柄类 NSFileHandle(系统类库)

    操作系统返回给我们程序的文件指针(文件手柄)

  • 对文件进行读写首先需要NSFileHandle打开文件
  • NSFileHandle都是用NSData类型的二进制数据,对文件进行读写的
  • NSData与NSString之间的相互转换

操作方法:

-》打开文件方法

//以只读方式打开

    + (id)fileHandleForReadingAtPath:(NSString *)path;

//以只写方式打开

+ (id)fileHandleForWritingAtPath:(NSString *)path;

//以读写方式打开

+ (id)fileHandleForUpdatingAtPath:(NSString *)path;

-》读指定长度的数据

- (NSData *)readDataOfLength:(NSUInteger)length;

文件的偏移量:又称为文件的读写指针,或称为位置指针,其实就是,该位置偏移文件开始处的偏移字符数量,是个无符号长整型的数据

-》从当前偏移量读到文件尾

- (NSData *)readDataToEndOfFile;

-》设置文件偏移量

- (void)seekToFileOffset:(unsigned long long)offset;

-》将文件偏移量定位到文件尾

- (unsigned long long)seekToEndOfFile;

-》将文件的长度设置为offset大小(单位为字节)

- (void)truncateFileAtOffset:

(unsigned long long)offset;

-》写文件

- (void)writeData:(NSData *)data;

-》将缓冲区内容立即同步写入磁盘

- (void)synchronizeFile;

eg.示例代码

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

  @autoreleasepool {
    NSString* myString = @"happy today";
      //对于信息数据进行按指定格式的编码,以便写入文件
    NSData* aData = [myString dataUsingEncoding:NSUTF8StringEncoding];
  
    NSMutableString* bString = [[NSMutableString alloc] initWithData:aData encoding:NSUTF8StringEncoding];
    
    [bString appendString:@",HELLO WORLD"];
    NSLog(@"%@",bString);

    aData = [bString dataUsingEncoding:NSUTF8StringEncoding];
    
    NSFileManager* fm = [NSFileManager defaultManager];
    
    [fm createFileAtPath:@"/Users/sub/Desktop/new.txt" contents:aData attributes:nil];
      //将文件以读写方式打开(以可更新方式打开)
    NSFileHandle* fh = [NSFileHandle fileHandleForUpdatingAtPath:@"/Users/sub/Desktop/new.txt"];
      //对文件进行读操作
    aData = [fh readDataOfLength:3];
    NSString* cString = [[NSString alloc] initWithData:aData encoding:NSUTF8StringEncoding];
    
    NSLog(@"%@",cString);
    [fh seekToFileOffset:10];
    aData = [fh readDataToEndOfFile];
    NSString* dString = [[NSString alloc] initWithData:aData encoding:NSUTF8StringEncoding];
    NSLog(@"%@",dString);
    
      //将文件清空
    [fh truncateFileAtOffset:0];
      //将编码后的数据写入文件
    [fh writeData:aData];
    [fh synchronizeFile];
  }
    return 0;
}

拓展: NSData(数据类)

-》把字符串转化为NSData

        NSString *str = @"welcome to myhome";       

        NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

        

-》将NSData转化为字符串        

        NSString *newStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

原文地址:https://www.cnblogs.com/sublimter/p/4162662.html