【iOS】第03讲 文件读写/NSArray/NSData/NSFileManager/NSFileHandle

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Nanhu2012/article/details/75311160

一、沙盒

   模拟器上的沙盒目录路径

   ~/Library/Application Support/iPhone Simulator/6.0/Applications


   

              

   获取沙盒的目录路径

    //NSHomeDirectory : 获取沙盒的目录路径

   NSString *homePath =NSHomeDirectory();

   NSLog(@"沙盒目录:%@",homePath);

    

   NSString *docPath1 = [NSStringstringWithFormat:@"%@/Documents",homePath];

   NSString *docPath2 = [homePathstringByAppendingFormat:@"/Documents"];

    

    NSLog(@"docPath1=%@,docPath2=%@",docPath1,docPath2);


二、文件管理

   2.1 NSString处理路径

    //NSString处理路径

    NSString *path =@"/Users/apple/file.text";

    //1.获取路径的组成部分结果:("/","Users","apple","file.text")

   NSArray *components = [pathpathComponents];

    

    //2.路径的最后一个组成部分结果:file.text

   NSString *lastName = [pathlastPathComponent];

    

    //3.追加文件或目录结果:/Users/apple/file.text/app.text

   NSString *filePath = [pathstringByAppendingString:@"app.text"];


    //4.删除最后的组成部分/扩展名

    NSString *deletePath = [pathstringByDeletingLastPathComponent];

    NSString *deleteExt = [pathstringByDeletingPathExtension];


    //5.获取扩展名/追加扩展名

   NSString *ext = [pathpathExtension];

    NSString *extPath = [pathstringByAppendingPathExtension:@"jpg"];



   2.2 NSData数据处理

     NSData是一种对数据的抽象

     任何数据都可以通过NSData来存储,NSMutableData是可变的,继承于NSData

       

   

   2.3 NSFileManager

      NSFileManager主要对文件进行管理,主要功能:

                                    

      NSFileManager管理文件的常用方法

    //NSHomeDirectory : 获取沙盒的目录路径

    NSString *homePath =NSHomeDirectory();

    NSLog(@"沙盒目录:%@",homePath);

    

    //1.创建一个文件并写入数据

    NSString* filePath = [homePathstringByAppendingPathComponent:@"Documents/1.jpg"];

    

    //NSFileManager 只能有一个实例对象,不能用alloc创建

    NSFileManager* fileManager = [NSFileManagerdefaultManager];

    BOOL result = [fileManagercreateFileAtPath:filePathcontents:nilattributes:nil];

    

    if(result)

        NSLog(@"file create success");

    else

        NSLog(@"file create fail");

    

    //2.创建文件夹

    filePath = [homePath stringByAppendingPathComponent:@"Documents/model/Smile/pic/01"];

    

    NSLog(@"%@",filePath);

    

    NSError *error;

    result = [fileManager createDirectoryAtPath:filePathwithIntermediateDirectories:YESattributes:nilerror:&error];

    

    if(result)

        NSLog(@"file dir create success");

    else

        NSLog(@"file dir create fail");

    

    //3.读取文件中的数据

    filePath = [homePath stringByAppendingPathComponent:@"Documents/1.jpg"];

    NSData *data = [fileManagercontentsAtPath:filePath];

    NSString *string = [[NSStringalloc] initWithData:dataencoding:NSUTF8StringEncoding];

    NSLog(@"%@",string);

    

    //4.移动文件

    NSString* targetPath = [homePathstringByAppendingPathComponent:@"Documents/model/Smile/pic/01/1.jpg"];

    result = [fileManager moveItemAtPath:filePathtoPath:targetPath error:nil];

    

    if(result)

        NSLog(@"file move success");

    

    //5.复制文件

    result = [fileManager copyItemAtPath:targetPathtoPath:filePath error:nil];

    if(result)

        NSLog(@"file copy success");

    

    //6.删除文件

    BOOL fileExist = [fileManagerfileExistsAtPath:filePath];

    if(fileExist)

    {

        result = [fileManager removeItemAtPath:filePatherror:nil];

        if(result)

            NSLog(@"file remove success");

    }

    

    //7.获取文件大小

    NSDictionary* fileAttr = [fileManagerattributesOfItemAtPath:targetPatherror:nil];

    NSLog(@"%@",fileAttr);

    

    NSNumber *fileSize = [fileAttrobjectForKey:NSFileSize];

    int sizeValue = [fileSizeintValue];

    

    NSLog(@"文件大小%d",sizeValue);


   2.4 写文件

     数组NSArray、字典NSDictionary、字符串NSString、NSData 都是容纳数据的

     NSArray、NSDictionary中只能

         存入NSNumber、NSString、NSData、NSDate、NSArray、NSDictionary

          才能写入文件,写入后以xml方式存储

     它们都有一个writeToFile方法将数据写入文件

                 

    

    //NSString 读写文件

    filePath = [homePath stringByAppendingPathComponent:@"Documents/file.text"];

    NSString *s =@"Hello iOS";

    

    [s writeToFile:filePathatomically:YESencoding:NSUTF8StringEncodingerror:nil];

    

    NSString *fileString = [NSStringstringWithContentsOfFile:filePathencoding:NSUTF8StringEncodingerror:nil];

    

    NSLog(@"%@",fileString);

    

    //NSData 读写文件

    NSData *data = [[NSDataalloc] initWithContentsOfFile:filePath];

    fileString = [[NSStringalloc] initWithData:dataencoding:NSUTF8StringEncoding];

    NSLog(@"%@",fileString);

    

    [data writeToFile:filePathatomically:YES];

    

    //NSArray 读写文件

    filePath = [homePath stringByAppendingPathComponent:@"Documents/array.plist"];

    

    NSString *s1 =@"voron";

    NSString *s2 =@"lisa";

    

    NSArray *array = [[NSArrayalloc] initWithObjects:s1,s2,nil];

    

    result = [array writeToFile:filePathatomically:YES];

    

    if(result)

        NSLog(@"NSArray write to file success");

    

    NSArray* readArray = [[NSArrayalloc] initWithContentsOfFile:filePath];

    for(NSString *sin readArray)

        NSLog(@"s=%@",s);

    

    //NSDictionary 读写文件

    NSDictionary *dict =@{

                          @"name":@"jack",

                          @"birth":[NSDatedate],

                          @"age":@22

                          };

    filePath = [homePath stringByAppendingPathComponent:@"Documents/dict.plist"];

    result = [dict writeToFile:filePathatomically:YES];

    

    NSDictionary *readDict = [NSDictionarydictionaryWithContentsOfFile:filePath];

    NSLog(@"%@",readDict);


    2.5 NSFileHandle
        NSFileHandle主要是对文件内容进行读取和写入操作
            不能创建文件
       

    //NSFileHandle

    //1.追加写入数据

    //创建一个写入的FileHandle对象

    NSFileHandle *writeHandle = [NSFileHandlefileHandleForWritingAtPath:filePath];

    [writeHandle seekToEndOfFile];

    NSString *appendString =@"appending data";

    NSData* data = [appendStringdataUsingEncoding:NSUTF8StringEncoding];

    

    [writeHandle writeData:data];

    

    [writeHandle closeFile];

    

    //2.定位读取

    NSFileHandle *readHandle = [NSFileHandlefileHandleForReadingAtPath:filePath];

    //获得文件长度

    NSDictionary* fileAttr = [fileManagerattributesOfItemAtPath:filePatherror:nil];

    

    NSNumber *fileSize = [fileAttrobjectForKey:NSFileSize];

    unsignedlong long sizeValue = [fileSizelongLongValue];

    //设置偏移量

    [readHandle seekToFileOffset:sizeValue/2];

    

    data = [readHandle readDataToEndOfFile];

    

    NSString *dataString = [[NSStringalloc] initWithData:dataencoding:NSUTF8StringEncoding];

    NSLog(@"%@",dataString);

       

三、文件读写类和文件管理类实现

    3.1 File类

      File.h

#ifndef File_h

#define File_h


enum FileType

{

    FT_WriteOnly,

    FT_ReadOnly,

    FT_ReadWrite

};


class File

{

public:

    File(const char* relPath,NSString* absolutePath);

    virtual ~File();

    

    void Open(FileType type);

    

    void Write(const char* data,int size);

    

    void Read(char*& data,int size);

    

    void Close();

    

private:

    NSFileHandle *fileHandle;

    

    const char* relativePath;

    NSString* absolutePath;

};


#endif /* File_h */


      File.mm

#import <Foundation/Foundation.h>

#import "File.h"


File::File(const char* relPath,NSString* absPath)

:relativePath(relPath),

absolutePath(absPath)

{

    //

}


File::~File()

{

    //

}


void File::Open(FileType type)

{

    if(FT_WriteOnly == type)

    {

        fileHandle = [NSFileHandle fileHandleForWritingAtPath:absolutePath];

        [fileHandle seekToEndOfFile];

    }

    else if(FT_ReadOnly == type)

    {

        fileHandle = [NSFileHandle fileHandleForReadingAtPath:absolutePath];

    }

    else if(FT_ReadWrite == type)

    {

        fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:absolutePath];

    }

}


void File::Write(const char *data, int size)

{

    NSData *data_ = [NSData dataWithBytes:data length:size];

    

    [fileHandle writeData:data_];

    

}


void File::Read(char *&data, int size)

{

    //

}


void File::Close()

{

    [fileHandle closeFile];

}


    3.2 FileManager类

      FileManager.h

#ifndef FileManager_h

#define FileManager_h

#include <map>

#include "Singleton.h"

#include "File.h"

using std::map;


class FileManager : public Singleton<FileManager>

{

public:

    FileManager();

    virtual ~FileManager();

    

    File* CreateFile(const char* relativePath);

    

private:

    NSFileManager *fileManager;

    

    NSString *mainPath;

    

    map<const char*,File*> fileMap;

};


#endif /* FileManager_h */


      FileManager.mm

#import <Foundation/Foundation.h>

#import "FileManager.h"


template<>

FileManager* Singleton<FileManager>::ms_pSingleton(0);


FileManager::FileManager()

{

    fileManager = [NSFileManager defaultManager];

    

    NSString *homePath = NSHomeDirectory();

    mainPath = [homePath stringByAppendingPathComponent:@"Documents"];


}


FileManager::~FileManager()

{

}


File* FileManager::CreateFile(const char *relativePath)

{

    NSString* relPath = [NSString stringWithUTF8String:relativePath];

    NSString* relativePathWithoutLast = [relPath stringByDeletingLastPathComponent];

    

    NSString* filePath = [mainPath stringByAppendingPathComponent:relativePathWithoutLast];

    

    NSLog(@"%@",filePath);

    BOOL fileExist = [fileManager fileExistsAtPath:filePath];

    if(!fileExist)

    {

        BOOL result = [fileManager createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];

    

        if(result)

            NSLog(@"file dir create success");

        else

            NSLog(@"file dir create fail");

        

    }

    

    filePath = [mainPath stringByAppendingPathComponent:relPath];

    NSLog(@"%@",filePath);

    

    fileExist = [fileManager fileExistsAtPath:filePath];

    if(!fileExist)

    {

        BOOL result = [fileManager createFileAtPath:filePath contents:nil attributes:nil];

        

        if(result)

        {

            NSLog(@"file create success");

            File* file = new File(relativePath,filePath);

            fileMap[relativePath] = file;

            return file;

        }

        else

            NSLog(@"file create fail");

    }

    else

    {

        if(fileMap.find(relativePath) != fileMap.end())

            return fileMap[relativePath];

        

        File* file = new File(relativePath,filePath);

        fileMap[relativePath] = file;

        return file;

    }

    

    return 0;

}


猜你喜欢

转载自blog.csdn.net/Nanhu2012/article/details/75311160
今日推荐