zoukankan      html  css  js  c++  java
  • 【IPHONE开发-OBJECTC入门学习】文件的操作,读写复制文件

    转自:http://blog.csdn.net/java886o/article/details/9041547

    FileTools.h

    #import <Foundation/Foundation.h>
    //文件工具类
    @interface FileTools : NSObject

    //复制文件
    + (void) copyFileWithSrcFile:(NSString*) srcFilePath withBakFile:(NSString*) bakFilePath;

    //获取文件的大小
    + (NSNumber*) fileLengthWithFile:(NSString*) filePath;

    @end


    FileTools.m

    #import "FileTools.h"
    
    @implementation FileTools
    
    //复制文件
    + (void) copyFileWithSrcFile:(NSString*) srcFilePath withBakFile:(NSString*) bakFilePath {
        //1.利用NSFileManager复制文件
        //NSFileManager* manager = [NSFileManager defaultManager];
        //[manager copyItemAtPath:srcFilePath toPath:bakFilePath error:nil];
        
        
        //2.利用读原文件,写新文件复制文件
        NSFileManager* fileManager = [NSFileManager defaultManager];
        
        //创建新文件
        BOOL createResult = [fileManager createFileAtPath:bakFilePath contents:nil attributes:nil];
        if (createResult) {
            NSLog(@"文件创建成功...");
        }else {
            NSLog(@"文件创建失败...");
            return;
        }
        
        
        NSFileHandle* inStream = [NSFileHandle fileHandleForReadingAtPath:srcFilePath];
        
        //特别注意-----必须先创建文件再创建outStream,否则将出现拷贝文件大小为0的问题
        
        NSFileHandle* outStream = [NSFileHandle fileHandleForWritingAtPath:bakFilePath];
        
     
        
        //初始化变量
        NSInteger readCount = 0;
        NSInteger fileSize = [[self fileLengthWithFile:srcFilePath] intValue];
    
        NSLog(@"复制的文件大小为:%ld",fileSize);
    
        BOOL isCanRead = YES;
        NSData* bufferData = nil;
        
        while(isCanRead) { //如果可以读文件,则开始读文件
            [inStream seekToFileOffset:readCount];
            if ((fileSize - readCount) < (1024 * 8)) { //如果剩下可读的文件小于8K,则直接读取到文件末尾,并保存文件,然后结束读取文件
                bufferData = [inStream readDataToEndOfFile];
                isCanRead = false;
                [outStream writeData:bufferData];
                break;
            }else { //如果剩余的刻度文件大于等于8K,则跳转到已读文件位置,并读取8K的数据,保存文件,然后继续读取
                bufferData = [inStream readDataOfLength:(1024 * 8)];
                readCount+= (1024 * 8);
                [outStream writeData:bufferData];
    
            }
        }
        
        [outStream closeFile];
        [inStream closeFile];
           
        NSLog(@"文件拷贝完成...");
    }
    
    //获取文件大小
    + (NSNumber*) fileLengthWithFile:(NSString*) filePath {
        NSFileManager* manager = [NSFileManager defaultManager];
        NSDictionary* attrs = [manager attributesOfItemAtPath:filePath error:nil];
        return [attrs objectForKey:NSFileSize];
    }
    
    
    @end



     

    测试 main.m

     

     

        1. #import <Foundation/Foundation.h>   
        2. #import "FileTools.h"   
        3.   
        4. int main(int argc, const char * argv[])  
        5. {  
        6.   
        7.     @autoreleasepool {  
        8.     
        9.         NSNumber* size = [FileTools fileLengthWithFile:@"/Users/3g2win/Downloads/ios_development.cer"];  
        10.         NSLog(@"文件大小:%d",[size intValue]);  
        11.         [FileTools copyFileWithSrcFile:@"/Users/3g2win/Downloads/ios_development.cer" withBakFile:@"/Users/3g2win/Downloads/ios_development_备份.cer"];  
        12.           
        13.     }  
        14.     return 0;  
        15. }  
  • 相关阅读:
    1024 Calendar Game
    外存管理与文件系统(1)
    1008 Gnome Tetravex
    写给想用技术改变世界的年轻人by 沃兹
    为什么VS2008里没有Silverlight呢?
    QQ消息群发器实现原理及核心代码
    JavaScript检测多组Radio是否选择
    C#操作Excel(导入导出)
    String.Split 方法有6个重载函数:
    【原】Ext2.2学习系列:ExtJS与.NET结合开发实例全部Ext2.2示例索引贴 (共收录56篇文章)
  • 原文地址:https://www.cnblogs.com/LCGIS/p/3290443.html
Copyright © 2011-2022 走看看