zoukankan      html  css  js  c++  java
  • 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];

  • 相关阅读:
    Balanced Binary Tree
    Swap Nodes in Pairs
    Reverse Nodes in k-Group
    Reverse Linked List II
    Remove Nth Node From End of List
    Remove Duplicates from Sorted List II
    Remove Duplicates from Sorted List
    Partition List
    Merge Two Sorted Lists
    【Yii2.0】1.2 Apache检查配置文件语法
  • 原文地址:https://www.cnblogs.com/sublimter/p/4162662.html
Copyright © 2011-2022 走看看