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

  • 相关阅读:
    每日一段(A Campaign Speech)(1)
    web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
    通过PHP实现浏览器点击下载TXT文档(转)
    php中mysql与mysqli的区别
    软件开发和团队”最小模式”初探2-6人模型(下)
    软件开发和团队”最小模式”初探2-6人模型(上)
    引论-谈下我的软件和团队之路
    软件开发和团队”最小模式”初探1
    C# 时间校验器
    SQL语句删除和添加外键、主键
  • 原文地址:https://www.cnblogs.com/sublimter/p/4162662.html
Copyright © 2011-2022 走看看