• [ios] IOS文件操作的两种方式:NSFileManager操作和流操作【转】


    http://blog.csdn.net/likendsl/article/details/8348939

    1、文件的创建

     

    -(IBAction) CreateFile

    {

    //对于错误信息

    NSError *error;

    // 创建文件管理器

    NSFileManager *fileMgr = [NSFileManager defaultManager];

    //指向文件目录

    NSString *documentsDirectory= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];


    //创建一个目录

    [[NSFileManager defaultManager]   createDirectoryAtPath: [NSString stringWithFormat:@"%@/myFolder", NSHomeDirectory()] attributes:nil];


    // File we want to create in the documents directory我们想要创建的文件将会出现在文件目录中

    // Result is: /Documents/file1.txt结果为:/Documents/file1.txt

    NSString *filePath= [documentsDirectory

    stringByAppendingPathComponent:@"file2.txt"];

    //需要写入的字符串

    NSString *str= @"iPhoneDeveloper Tips\nhttp://iPhoneDevelopTips,com";

    //写入文件

    [str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error];

    //显示文件目录的内容

    NSLog(@"Documentsdirectory:  contentsOfDirectoryAtPath:documentsDirectory error:&error]);


    }

     


     

     

    2、对文件重命名

     

    对一个文件重命名
    想要重命名一个文件,我们需要把文件移到一个新的路径下。下面的代码创建了我们所期望的目标文件的路径,然后请求移动文件以及在移动之后显示文件目录。
    //通过移动该文件对文件重命名
    NSString *filePath2= [documentsDirectory
    stringByAppendingPathComponent:@"file2.txt"];
    //判断是否移动
    if ([fileMgr moveItemAtPath:filePath toPath:filePath2 error:&error] != YES)
    NSLog(@"Unable to move file: %@", [error localizedDescription]);
    //显示文件目录的内容
    NSLog(@"Documentsdirectory: %@",
    [fileMgr contentsOfDirectoryAtPath:documentsDirectoryerror:&error]);

     

     

    3、删除一个文件

     


    为了使这个技巧完整,让我们再一起看下如何删除一个文件:
    //在filePath2中判断是否删除这个文件
    if ([fileMgr removeItemAtPath:filePath2 error:&error] != YES)
    NSLog(@"Unable to delete file: %@", [error localizedDescription]);
    //显示文件目录的内容
    NSLog(@"Documentsdirectory: %@",
    [fileMgr contentsOfDirectoryAtPath:documentsDirectoryerror:&error]);
    一旦文件被删除了,正如你所预料的那样,文件目录就会被自动清空:

    这些示例能教你的,仅仅只是文件处理上的一些皮毛。想要获得更全面、详细的讲解,你就需要掌握NSFileManager文件的知识。


     

     

    4、删除目录下所有文件

     

    //获取文件路径
    - (NSString *)attchmentFolder{

    NSString *document = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

    NSString *path = [document stringByAppendingPathComponent:@"Attchments"];


    NSFileManager *manager = [NSFileManager defaultManager];


    if(![manager contentsOfDirectoryAtPath:path error:nil]){

    [manager createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:nil];

    }


    return path;

    }

     

    --清除附件
    BOOL result = [[NSFileManager defaultManager] removeItemAtPath:[[MOPAppDelegate instance] attchmentFolder] error:nil];


     


    IPhone中获取文件各项属性方法

    -(NSData *)applicationDataFromFile:(NSString *)fileName
    {
        NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
        NSString *documentsDirectory =[paths objectAtIndex:0];
        NSString *appFile =[documentsDirectory stringByAppendingPathComponent:fileName];
        NSData *data =[[[NSData alloc]initWithContentsOfFile:appFile]autorelease];
        return data;
    }


    -(void)getFileAttributes
    {
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *path = @"/1ct.rtf";
    NSDictionary *fileAttributes = [fileManager fileAttributesAtPath:path traverseLink:YES];
        NSLog(@"@@");
    if (fileAttributes != nil) {
        NSNumber *fileSize;
        NSString *fileOwner, *creationDate;
        NSDate *fileModDate;
        //NSString *NSFileCreationDate

    //文件大小
        if (fileSize = [fileAttributes objectForKey:NSFileSize]) {
            NSLog(@"File size: %qi\n", [fileSize unsignedLongLongValue]);
        }

    //文件创建日期
        if (creationDate = [fileAttributes objectForKey:NSFileCreationDate]) {
            NSLog(@"File creationDate: %@\n", creationDate);
            //textField.text=NSFileCreationDate;
        }

    //文件所有者
        if (fileOwner = [fileAttributes objectForKey:NSFileOwnerAccountName]) {
            NSLog(@"Owner: %@\n", fileOwner);
        }

    //文件修改日期
        if (fileModDate = [fileAttributes objectForKey:NSFileModificationDate]) {
            NSLog(@"Modification date: %@\n", fileModDate);
        }
     }
    else {
        NSLog(@"Path (%@) is invalid.", path);
       }
    }

     

     

    ///////////////////

    文件类型,文件缩略图呢???

     

    ============================

    //获取当前应用程序的主目录
    NSString directoryPath =NSHomeDirectory();


    //获取当前目录下的所有文件
    NSArray directoryContents = [[NSFileManager defaultManager] directoryContentsAtPath: directoryPath];

     

    //获取一个文件或文件夹
    NSString *selectedFile = (NSString*)[directoryContents objectAtIndex: indexPath.row];


    //拼成一个完整路径
    [directoryPath stringByAppendingPathComponent: selectedFile];

     

     


    BOOL isDir;

    //判断是否是为目录


    if ([[NSFileManager defaultManager] fileExistsAtPath:selectedPath isDirectory:&isDir] && isDir)

    {//目录
    }

    else

    {//文件
    }

     

     

     

     

    //日期格式化
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];

    [dateFormatter setTimeStyle:NSDateFormatterNoStyle];


    //数字格式化

    NSNumberFormatter *numberFormatter =[[NSNumberFormatter alloc] init];

    [numberFormatter setPositiveFormat: @"#,##0.## bytes"];

     

     

    //获取文件属性

    NSDictionary *fileAttributes =[[NSFileManager defaultManager] fileAttributesAtPath: directoryPath traverseLink: YES];

    //获取文件的创建日期

    NSDate *modificationDate = (NSDate*)[fileAttributes objectForKey: NSFileModificationDate];

    //获取文件的字节大小

    NSNumber *fileSize = (NSNumber*)[fileAttributes objectForKey: NSFileSize];
    //格式化文件大小
    nsstring A = [numberFormatter stringFromNumber: fileSize];

    //格式化文件创建日期

    NSstring B =[dateFormatter stringFromDate: modificationDate];

     


    [numberFormatter release];

    [dateFormatter release];

     

    //读取文件内容操作- (void) loadFileContentsIntoTextView{

     

     

    //通过流打开一个文件

     

    NSInputStream *inputStream = [[NSInputStream alloc] initWithFileAtPath: filePath];

     

    [inputStream open];

     


    NSInteger maxLength = 128;

    uint8_t readBuffer [maxLength];

    //是否已经到结尾标识

    BOOL endOfStreamReached = NO;

    // NOTE: this tight loop will block until stream ends

    while (! endOfStreamReached)

    {

    NSInteger bytesRead = [inputStream read: readBuffer maxLength:maxLength];

    if (bytesRead == 0)

    {//文件读取到最后

    endOfStreamReached = YES;

    }

    else if (bytesRead == -1)

    {//文件读取错误

    endOfStreamReached = YES;

    }

    else

    {

    NSString *readBufferString =[[NSString alloc] initWithBytesNoCopy: readBuffer length: bytesRead encoding: NSUTF8StringEncoding freeWhenDone: NO];   

    //将字符不断的加载到视图

    [self appendTextToView: readBufferString];

    [readBufferString release];

    }

    }

    [inputStream close];

    [inputStream release];

    }

     

    异步文件的读取 ,在网络方面,由于网络的不可靠性可能会造成NSFileManager的文件操作方法的阻塞,而以流的方式进行操作则可以实现异步的读取。

    NSStream是可以异步工作的。可以注册一个在流中有字节可读的时候回调的函数,如果没有可读的,就不要阻塞住,回调出去。

     

     

     

    1、在Documents里创建目录

    创建一个叫test的目录,先找到Documents的目录,

    1. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    
    2.    NSString *documentsDirectory = [paths objectAtIndex:0];    
    3.    NSLog(@"documentsDirectory%@",documentsDirectory);    
    4.    NSFileManager *fileManager = [NSFileManager defaultManager];    
    5.    NSString *testDirectory = [documentsDirectory stringByAppendingPathComponent:@"test"];    
    6.    // 创建目录  
    7.    [fileManager createDirectoryAtPath:testDirectory withIntermediateDirectories:YES attributes:nil error:nil];  

    启动程序,这时候目录就创建了:

     

    2、在test目录下创建文件

    创建文件怎么办呢?接着上面的代码 testPath 要用stringByAppendingPathComponent拼接上你要生成的文件名,比如test00.txt。这样才能在test下写入文件。

    testDirectory是上面代码生成的路径哦,不要忘了。我往test文件夹里写入三个文件,test00.txt ,test22.txt,text.33.txt。内容都是写入内容,write String。

    实现代码如下:

    1. NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test00.txt"];    
    2. NSString *testPath2 = [testDirectory stringByAppendingPathComponent:@"test22.txt"];    
    3. NSString *testPath3 = [testDirectory stringByAppendingPathComponent:@"test33.txt"];    
    4.   
    5.   
    6. NSString *string = @"写入内容,write String";  
    7. [fileManager createFileAtPath:testPath contents:[string  dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];  
    8. [fileManager createFileAtPath:testPath2 contents:[string  dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];  
    9. [fileManager createFileAtPath:testPath3 contents:[string  dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];  

    看下面的图,三个文件都出来了,内容也对。

    在Documents目录下创建就更简单了,不用加test就ok了

    3、获取目录列里所有文件名

    两种方法获取:subpathsOfDirectoryAtPath 和 subpathsAtPath

    1. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    
    2. NSString *documentsDirectory = [paths objectAtIndex:0];    
    3. NSLog(@"documentsDirectory%@",documentsDirectory);    
    4. NSFileManager *fileManage = [NSFileManager defaultManager];    
    5. NSString *myDirectory = [documentsDirectory stringByAppendingPathComponent:@"test"];    
    6. NSArray *file = [fileManage subpathsOfDirectoryAtPath: myDirectory error:nil];   
    7. NSLog(@"%@",file);    
    8. NSArray *files = [fileManage subpathsAtPath: myDirectory ];   
    9. NSLog(@"%@",files);  

    获取上面刚才test文件夹里的文件名

    打印结果

    2012-06-17 23:23:19.684 IosSandbox[947:f803] fileList:(

        ".DS_Store",

        "test00.txt",

        "test22.txt",

        "test33.txt"

    )

    2012-06-17 23:23:19.686 IosSandbox[947:f803] fileLit(

        ".DS_Store",

        "test00.txt",

        "test22.txt",

        "test33.txt"

    )

    两个方法都可以,隐藏的文件也打印出来了。

    4、fileManager使用操作当前目录

    1. //创建文件管理器  
    2.     NSFileManager *fileManager = [NSFileManager defaultManager];  
    3.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
    4.     NSString *documentsDirectory = [paths objectAtIndex:0];  
    5.     //更改到待操作的目录下  
    6.     [fileManager changeCurrentDirectoryPath:[documentsDirectory stringByExpandingTildeInPath]];  
    7.     //创建文件fileName文件名称,contents文件的内容,如果开始没有内容可以设置为nil,attributes文件的属性,初始为nil  
    8.     NSString * fileName = @"testFileNSFileManager.txt";  
    9.     NSArray *array = [[NSArray alloc] initWithObjects:@"hello world",@"hello world1", @"hello world2",nil];  
    10.     [fileManager createFileAtPath:fileName contents:array attributes:nil];  

    这样就创建了testFileNSFileManager.txt并把三个hello world写入文件了

    changeCurrentDirectoryPath目录更改到当前操作目录时,做文件读写就很方便了,不用加上全路径

    5、删除文件

    接上面的代码,remove就ok了。

    1. [fileManager removeItemAtPath:fileName error:nil];  

    6、混合数据的读写

    用NSMutableData创建混合数据,然后写到文件里。并按数据的类型把数据读出来

    6.1写入数据:

    1. NSString * fileName = @"testFileNSFileManager.txt";  
    2. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
    3. NSString *documentsDirectory = [paths objectAtIndex:0];  
    4. //获取文件路径  
    5. NSString *path = [documentsDirectory stringByAppendingPathComponent:fileName];  
    6. //待写入的数据  
    7. NSString *temp = @"nihao 世界";  
    8. int dataInt = 1234;  
    9. float dataFloat = 3.14f;  
    10. //创建数据缓冲  
    11. NSMutableData *writer = [[NSMutableData alloc] init];  
    12. //将字符串添加到缓冲中  
    13. [writer appendData:[temp dataUsingEncoding:NSUTF8StringEncoding]];     
    14. //将其他数据添加到缓冲中  
    15. [writer appendBytes:&dataInt length:sizeof(dataInt)];  
    16. [writer appendBytes:&dataFloat length:sizeof(dataFloat)];    
    17. //将缓冲的数据写入到文件中  
    18. [writer writeToFile:path atomically:YES];  


    我们看看数据怎么样了:


    我们看到后面的是乱码,那是中文被转成了NSData后,还有int float的二进制

    6.2读取刚才写入的数据:

    1. //读取数据:  
    2.    int intData;  
    3.    float floatData = 0.0;  
    4.    NSString *stringData;  
    5.      
    6.    NSData *reader = [NSData dataWithContentsOfFile:path];  
    7.    stringData = [[NSString alloc] initWithData:[reader subdataWithRange:NSMakeRange(0, [temp length])]  
    8.                                   encoding:NSUTF8StringEncoding];  
    9.    [reader getBytes:&intData range:NSMakeRange([temp length], sizeof(intData))];  
    10.    [reader getBytes:&floatData range:NSMakeRange([temp length] + sizeof(intData), sizeof(floatData))];  
    11.    NSLog(@"stringData:%@ intData:%d floatData:%f", stringData, intData, floatData);  


    打印出来的结果:

    2012-06-17 23:51:14.723 IosSandbox[1285:f803] stringData:nihao hello! intData:1234332 floatData:3.140000

    这里把写入的汉字改成了 hello。因为[temp length]算长度是,把中文算成一位了,出来的结果有误。

     

    例子代码:https://github.com/schelling/YcDemo

    著作权声明:本文由http://blog.csdn.net/totogo2010/原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢
  • 相关阅读:
    如何更专业的使用Chrome开发者工具
    Javascript中的Object对象
    【leetcode】 Remove Duplicates from Sorted List
    Windows上x86程序正常但x64程序崩溃问题
    Microsoft source-code annotation language (SAL) 相关
    Visual Studio 2013 编译CEF步骤
    C++中调用Python脚本
    MFCButton Memory leak(内存泄露问题)
    快速排序
    插入排序
  • 原文地址:https://www.cnblogs.com/jinjiantong/p/3006597.html
Copyright © 2020-2023  润新知