自學iOS開發系列----OC(文件管理類、文件句柄類)

1.NSString和NSData互相轉化

NSString * str = @"hello世界";
NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"數據大小:%lu",data.length);
NSLog(@"字符串長度:%lu",str.length);

//一個漢字的長度是1,佔3個字節
NSString * strData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",strData);

2.文件管理類NSFileManager
對文件進行管理操作:
①遍歷查看目錄下的文件
【深度遍歷】
【淺度遍歷】
②創建文件/目錄
③拷貝文件/目錄
④移動文件/目錄
⑤刪除文件/目錄
⑥獲取文件屬性

新建HTFileManager類

①HTFileManager.h

#import <Foundation/Foundation.h>

@interface HTFileManager : NSObject

//創建文件目錄/文件
+(void)createDirectoryOrFile;

//遍歷目錄下的內容
+(void)scanDirectoryOrFile;

//拷貝文件/目錄
+(void)copyDirectoryOrFile;

//移動文件/目錄
+(void)moveDirectoryOrFile;

//刪除文件/目錄
+(void)removeDirectoryOrFile;

//獲取文件屬性
+(void)attributeForDirectoryOrFile;

@end

②HTFileManager.m

#import "HTFileManager.h"

#define Desktop @"/Users/yimiyangguang/Desktop"

#define FILM @"/Users/yimiyangguang/Desktop/Film1"

@implementation HTFileManager

+ (void)createDirectoryOrFile {
    NSFileManager * fileManager = [NSFileManager defaultManager];

    //在桌面上創建一個文件夾 Film1
    NSString * path = [Desktop stringByAppendingPathComponent:@"Film1"];
    NSLog(@"Path = %@",path);

    //判斷一個目錄是否存在,不存在則創建
    if (![fileManager fileExistsAtPath:path]) {
        NSError * error = nil;

        /**
         *  @param  path:目錄的路徑
         *  @param  createIntermediates:中間目錄是否缺省,默認填YES
         *  @param  attributes:目錄的屬性,默認填nil,(包含默認屬性)
         *  @param  error:&error
         */
        BOOL success = [fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error];
        if (success) {
            NSLog(@"目錄創建成功");
        }else{
            NSLog(@"目錄創建失敗,error:%@",error);
        }

    }else{
        NSLog(@"該目錄已存在");
    }

    //創建一個文件 test.txt
    NSString * filePath = [path stringByAppendingPathComponent:@"test.txt"];
    NSString * content = @"睡一覺,明天更美好!";
    NSData * data = [content dataUsingEncoding:NSUTF8StringEncoding];

    if (![fileManager fileExistsAtPath:filePath]) {

        /**
         *  @param  path:文件路徑
         *  @param  data:文件的內容,當是nil,創建出的是空文件
         *  @param  attr:文件的屬性
         */
        BOOL success = [fileManager createFileAtPath:filePath contents:data attributes:nil];
        if (success) {
            NSLog(@"文件創建成功");
        }else {
            NSLog(@"文件創建失敗");
        }

    }else{
        NSLog(@"文件已存在");
    }
}

+ (void)scanDirectoryOrFile {
    NSFileManager * fileManager = [NSFileManager defaultManager];

    //淺度遍歷(一級目錄)
    if ([fileManager fileExistsAtPath:@"/Users/yimiyangguang/Desktop/Film1"]) {

        NSArray * array = [fileManager contentsOfDirectoryAtPath:@"/Users/yimiyangguang/Desktop/Film1" error:nil];

        NSLog(@"%@",array);
    }

    //深度遍歷(子目錄的子目錄的子目錄。。。)
    if ([fileManager fileExistsAtPath:@"/Users/yimiyangguang/Desktop/Film1"]) {

        NSArray * array = [fileManager subpathsOfDirectoryAtPath:@"/Users/yimiyangguang/Desktop/Film1" error:nil];

        NSLog(@"深度遍歷:%@",array);
    }
}

+ (void)copyDirectoryOrFile {
    NSFileManager * fm = [NSFileManager defaultManager];

    NSString * strPath = FILM;
    NSString * dstPath = @"/Users/yimiyangguang/Desktop/File2";

    NSError * error = nil;

    if ([fm fileExistsAtPath:strPath]) {

        /**
         *  @param  srcPath:原路徑
         *  @param  dstPath:目的路徑
         *  @error  error:&error
         */
        BOOL success = [fm copyItemAtPath:strPath toPath:dstPath error:&error];
        if (success) {
            NSLog(@"copy 成功");
        }else {
            NSLog(@"copy 失敗 %@",error);
        }
    }else {
        NSLog(@"源文件不存在");
    }
}

+ (void)moveDirectoryOrFile {
    NSFileManager * fm = [NSFileManager defaultManager];

    //移動的過程中也可以修改文件名
    NSString * srcPath = FILM;
    NSString * desPath = @"/Users/yimiyangguang/Desktop/File2/File3";

    NSError * error = nil;
    BOOL success = [fm moveItemAtPath:srcPath toPath:desPath error:&error];
    if (success) {
        NSLog(@"move 成功");
    }
}

+ (void)removeDirectoryOrFile {
    NSFileManager * fm = [NSFileManager defaultManager];

    NSString * path = @"/Users/yimiyangguang/Desktop/File2/File3";

    if ([fm fileExistsAtPath:path]) {
        BOOL success = [fm removeItemAtPath:path error:nil];
        if (success) {
            NSLog(@"success");
        }else{
            NSLog(@"failed");
        }
    }
}

+ (void)attributeForDirectoryOrFile {
    NSFileManager * fm = [NSFileManager defaultManager];

    NSString * path = @"/Users/yimiyangguang/Desktop/File2/Second/4.jpg";

    if ([fm fileExistsAtPath:path]) {
        NSDictionary * dict = [fm attributesOfItemAtPath:path error:nil];
        NSLog(@"%@",dict);
    }
}

@end

③main.m

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "HTFileManager.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        //依次調用文件管理方法進行測試
        [HTFileManager createDirectoryOrFile];
        [HTFileManager scanDirectoryOrFile];
        [HTFileManager copyDirectoryOrFile];
        [HTFileManager moveDirectoryOrFile];
        [HTFileManager removeDirectoryOrFile];
        [HTFileManager attributeForDirectoryOrFile];
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

3.文件句柄類NSFileHandle
①對文件進行讀寫首先需要NSFileHandle打開文件
②NSFileHandle對文件進行讀寫都是NSData類型的二進制數據
③NSData與NSString之間的相互轉換
④操作文件完成後,記得closeFile

實際操作:
①對文件寫入數據
②對文件中的數據定位
③複製文件中的內容

新建HTFileHandle文件

①HTFileHandle.h

#import <Foundation/Foundation.h>

@interface HTFileHandle : NSObject

+ (void)test;

@end

②HTFileHandle.m

#import "HTFileHandle.h"

#define FILE_PATH @"/Users/yimiyangguang/Desktop/test.txt"

@implementation HTFileHandle

+ (void)test {
    /**
     *  類方法中self代表的是當前類LPCFileManager
     *  對象方法中self代表的是指向當前類LPCFileManager的對象
     */
    //讀取文件內容
    [self readFile];

    //將內容寫入文件
    [self writeFile];
}

+ (void)readFile {

    /**
     *  以只讀方式打開:[NSFileHandle fileHandleForReadingAtPath:FILE_PATH];
     *  以讀寫方式打開:[NSFileHandle fileHandleForUpdatingAtPath:FILE_PATH];
     */
    NSFileHandle * fh = [NSFileHandle fileHandleForReadingAtPath:FILE_PATH];
    NSData * data = [fh readDataToEndOfFile];

    //把NSData轉化爲NSString
    NSString * content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@",content);

    //設置偏移量:因爲一個漢字佔3個字節,當設置偏移量或獲取長度的時候,不能取到漢字的中間位置
    [fh seekToFileOffset:1 * 3];

    //讀取指定長度的數據
    NSData * data2 = [fh readDataOfLength:3 * 1];

    NSString * content2 = [[NSString alloc] initWithData:data2 encoding:NSUTF8StringEncoding];
    NSLog(@"%@",content2);

    //關閉文件
    [fh closeFile];
}

+ (void)writeFile {

    /**
     *  以只寫方式打開:[NSFileHandle fileHandleForWritingAtPath:FILE_PATH];
     *  以讀寫方式打開:[NSFileHandle fileHandleForUpdatingAtPath:FILE_PATH];
     */
    NSFileHandle * fh = [NSFileHandle fileHandleForUpdatingAtPath:FILE_PATH];

    //在文件的末端寫入數據(追加內容)
    [fh seekToEndOfFile];

    NSString * str = @"我們應該原諒他嗎?";
    NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];
    [fh writeData:data];

    [fh closeFile];
}

@end

③main.m

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "HTFileHandle.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        [HTFileHandle test];
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
發佈了54 篇原創文章 · 獲贊 83 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章