• OC语言--NSFileManager& NSFileHandle


    1.关于文件的介绍

     

    -》什么是文件:

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

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

     

    -》什么是路径:

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

     

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

     

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

     

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

    (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)单例模式是一种经常使用的设计模式。

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

    也就是说,对于一个单例类。不论实例化对象多少次。都仅仅有一个对象实例。并且这个实例是全局的。能被整个系统訪问到, 就像全局变量一样能够被整个project所共享它的数据。

     

    (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];

     

  • 相关阅读:
    数据库范式
    数据存储——SQLite数据库存储——SQL语句
    学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)
    数据存储——SQLite数据库存储——SQLite数据库
    数据存储——手机外部文件存储
    数据存储——手机内部文件存储2
    数据存储——手机内部文件存储
    制作一个登录界面,以SP方式存储用户名。用户下次登录时自动显示上次填写的用户名
    数据存储——SP存储 SP读取
    View(视图)——消息
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5343715.html
Copyright © 2020-2023  润新知