文件管理者NSFileManager && 寫入文件存儲 &&字符串操作 && NSInputStream

1.文件管理器

文件管理器:NSFileManager

//創建單例 f1     [NSFileManager defaultManager];

NSFileManager *f1 = [NSFileManager defaultManager];

NSLog(@“%p”,f1); //p輸出地址


NSFileManager *f2 = [NSFileManager defaultManager];

NSLog(@“%p”,f2); 

這裏輸出的地址一樣,所以證明了創建的是一個單例  


NSFileManager *f3 = [[NSFileManager alloc]init];

 如果用這種方式創建則創建出來的是不同的對象,不是單例                                                                                                      



//靜態變量,整個程序運行完成的時候纔會被釋放掉

static User *instance = nil;


+ (User *)defaultUser 

{

  if (instance == nil)

{

  instance = [[self alloc]init];

}

return instance;

}




先創建一個文件夾

 NSString *str = @"這是我創建的文件";

    NSError *error;

    BOOL isWriteSuccess = [str writeToFile:@"/Users/qianfeng/Desktop/我的文件.txt" atomically:YES encoding:NSUTF8StringEncoding error:&error];

    if (isWriteSuccess) {

        NSLog(@"創建成功");

    } else {

        NSLog(@"error %@",error);

    }

    



獲取文件屬性

1.獲取文件管理器

NSFileManager *fileManager = [NSFileManager defaultManager];

2.獲取文件屬性

NSString *path = @"/Users/qianfeng/Desktop/我的文件.txt";

NSError *error;

NSFileManager *fileManager = [NSFileManager defaultManager];

//獲取文件信息(屬性和權限)

NSDictionary *dic = [fileManager attributesOfItemAtPath:path error:&error];


    if (error == nil) {

//獲取文件創建日期

       NSDate *date = [dic objectForKey:NSFileCreationDate];

    }


文件管理器續:

1.獲取目錄下的文件與子文件目錄列表:

NSFileManager *fileManager = [NSFileManager defaultManager];

    NSString *path = @"/Users/qianfeng/Desktop/1026今日所學";

    NSError *error;

    //只能獲得目標目錄下的第一級目錄

    NSArray *array1 = [fileManager contentsOfDirectoryAtPath:path error:&error];

    //能逐級獲得目標目錄下的所有子目錄

     NSArray *array2 = [fileManager subpathsOfDirectoryAtPath:path error:&error];


2.管理目錄

1)創建目錄

NSFileManager *fileManager = [NSFileManager defaultManager];

    NSString *path = @"/Users/qianfeng/Desktop/新建問佳佳/QQQQ";

    NSError *error;

    //YES時,是逐級創建文件夾.NO時,只能創建一級目錄

    BOOL isCreateSuccess = [fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error];

    if (isCreateSuccess) {

        NSLog(@"目錄創建成功");

    } else {

        //注意這裏是error,不是&error

        NSLog(@"error:%@",error);

    } 

2)移動目錄(剪切操作)

    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSString *path = @"/Users/qianfeng/Desktop/新建問佳佳";

    NSString *pathto = @"/Users/qianfeng/Desktop/new";

    NSError *error;

    BOOL isMoveSuccess = [fileManager moveItemAtPath:path toPath:pathto error:&error];

    if (isMoveSuccess) {

        NSLog(@"移動成功");

    } else {

        NSLog(@"error:%@",error);

    }

3)刪除目錄

  removeItemAtPath:error:

4)拷貝文件

copyItemAtPath: toPath: error:


3.管理文件

1)獲得文件  創建文件

NSString *path0 = @"/Users/qianfeng/Desktop/新建0.png";

//無論什麼格式都能轉化爲NSData數據類型,mp4,mp3,text,doc等等

    NSData *data = [NSData dataWithContentsOfFile:path0];

    NSLog(@"data的大小(字節數)==%ld",data.length);//測試寫入是否成功

    

    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSString *path1 = @"/Users/qianfeng/Desktop/新建1.png";

    BOOL isCreateSuccess = [fileManager createFileAtPath:path1 contents:data attributes:nil];

    if (isCreateSuccess) {

        NSLog(@"創建文件成功");

    } else {

        NSLog(@"創建失敗");

    }

2)移動文件(同上)

3)刪除文件(同上)




使用NSData處理數據:(加載數據如視頻音頻文本文件等)


NSData是不可變長度的類型數據,只能通過一次加載完成所有數據

    NSString *path0 = @"/Users/qianfeng/Desktop/新建0.txt";

    //把目標路徑文件中的內容轉化成NSData類型,加載(存儲)到內存中

    NSData *data = [NSData dataWithContentsOfFile:path0];

    NSString *path1 = @"/Users/qianfeng/Desktop/新建1.txt";

    //寫入到指定文件中   

    BOOL isWriteSuccess = [data writeToFile:path1 atomically:YES];

    if (isWriteSuccess) {

        NSLog(@"寫入成功");

    } else {

        NSLog(@"寫入失敗");

    }

 

NSMutableData:

如果將多個字符串寫入文件中,則先將每一個字符串轉化爲NSData類型,然後拼接到mutableData上,將mutableData 寫入文件中.或者先拼接成一個字符串,然後再做。

如:NSString *str1 = @"ddddsfds";

    NSMutableData *mutabelData = [[NSMutableData alloc]init];

    NSData *data1 = [str1 dataUsingEncoding:NSUTF8StringEncoding];

    [mutabelData appendData:data1];



格式化日期操作:


1.//獲得日期對象  這裏是當前日期

    NSDate *date = [NSDate date];

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

    

2.比較兩個日期是否相同

3.格式化日期

NSDate *date = [NSDate date];

    //格式化日期對象

    NSDateFormatter *dataFormatter = [[NSDateFormatter alloc]init];

    //2015-10-29 130851

    [dataFormatter setDateFormat:@"qqqq-ww-ee hh:mm:ss"];

    //把格式與日期關聯起來

    NSString *str = [dataFormatter stringFromDate:date];

4.將字符串轉換成日期

5.處理時區問題   






//爲什麼要使用枚舉?

//有一些簡單的數據,既不方便使用基礎類型存儲,也不方便封裝爲結構體,就可以使用枚舉


結構體是將相同的或不同類型的數據封裝到一起生成新的數據結構





.h是頭文件,不是用來編譯的,只是用來拷貝的。.m文件纔是源代碼文件,纔是用來編譯的


類的本質:

類本身也是一個對象,是Class類型的對象,簡稱類對象。類對象 == 類

類名就代表類對象,每個類只有一個類對象

實例對象:用類創建出來的對象


例如:

Person *p = [[Person alloc]init];

//獲取內存中的類對象

Class c = [p class];  //class  Xcode會提示返回一個Class類型的數據    //這裏不要加*號,因爲本身就有(官方文檔中)

Class c1 = [Person class];


1.當程序啓動時,就會加載項目中所有的類和分類,而且加載後回調用每個類和分類的+load方法,只會調用一次

2.當第一次使用某個類時,就會調用當前類的+initialize方法

3.(+load)先加載父類,再加載子類。(+initialize)先初始化父類,再初始化子類。



默認情況下,利用NSLog和%@輸出對象時,結果是:<類名:內存地址>   內存地址就是對象地址

NSLog(@“%@”,p);

1.會調用對象p的- description方法

2.拿到-description方法的返回值(NSString *)顯示到屏幕上

3.-description方法默認返回的是 :<類名:內存地址>

如果想要拿到對象p的屬性,就要重寫-description方法


NSLog相關:

Person *p = [[Person alloc]init];

//指針變量的地址

NSLog(@“%@”,&p);

//對象的地址

NSLog(@“%@”,p);


//輸出當前函數名

NSLog(@“%s”,__func__);



2.什麼是SEL?

SEL:其實是對方法的一種包裝,將方法包裝成一個SEL類型的數據,去找對應的方法地址,找到方法地址就可以調用方法。

發消息就是發送SEL,消息就是SEL

1.方法的存儲位置:

每個類的方法列表都存儲在類對象中

每個方法都有一個與之相對應的SEL類型的對象

根據一個SEL對象就可以找到方法的地址,進而調用方法


2.SEL對象的創建:  SEL s = @selector(text);

   SEL s2 = NSSelectorFromString(@“text”);

SEL  本身就有*號(官方文檔中)

SEL  類型(int

      1. 是一個OC類型

      2. self 封裝了消息,即函數

      3. 一般使用 performSelector:調用

           ResponseToSelector:  調用前判斷調用方法是否存在

      4. @selector()  方法選擇器



設計模式:代理模式?觀察者模式?


NSObject是一個基類,也是一個基協議

一個協議遵守了另外一個協議,就可以擁有另一個協議的所有方法聲明

@protocol  

1.基本用途

可以用來聲明一大堆方法,不能聲明成員變量

只要某個類遵守了這個協議,就相當於擁有了這個協議中的所有方法的聲明

只要父類遵守了某個協議,就相當於子類也遵守了

2.例如要求obj3 保存的對象必須是遵守MyProtocol這個協議

NSObject<MyProtocol> *obj3 = [[Person alloc]init]; //這裏Person類遵守了MyProtocol協議的

id<MyProtocol> obj3 = [[Person alloc]init]; //等價上面  

@property (nonatomic,strong) id<MyProtocol> obj3;

3.協議可以定義在單獨的.h文件中,也可以定義在某個類中

如果這個協議只用在某個類中,應該把協議定義在該類中

如果這個協議用在很多類中,就應該定義在單獨文件中



我要給他發消息,就要調用他的方法就可以了,我拿到他方法的返回值給我,就是反饋


二、

/**  將字符串寫入文件

 

 *  //寫入文件

 

 NSString *str00 = @"hello world";

 //如果文件前面的路徑存在,而這個要寫入的文件開始時並不存在,那麼寫入字符串時,會自動創建一個文件,並將內容寫入這個文件中。如果文件存在,直接將內容寫入文件並將覆蓋原本文件中的內容。如果寫入文件之前的路徑也不存在,寫入失敗,不會自動創建不存在的文件夾

 NSString *filePath = @"/Users/liweiguo/Desktop/字符串文件/寫入文件2.txt";

 //atomic,原子操作  noatomic,非原子操作

 //YES時,向文件寫入字符串的過程中,會先創建一個臨時的文件,字符串會先臨時寫入到這個臨時的文件中,如果在寫入過程中,沒有中斷(完成寫入成功),這個臨時文件的內容就會最終移到我們要寫入的文件中,然後將臨時文件刪除;如果在往臨時文件裏寫入內容的過程中,寫入發生中斷,不會將之前寫入到臨時文件中的未完成的這部分內容移入到要寫入的文件中,而直接將臨時文件刪除。

 //NO時,不會創建一個臨時文件,而是直接往要寫入的文件裏面寫內容,如果寫入中途發生中斷,文件裏面會有一份寫入的不完整的內容

 [str00 writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];

 NSLog(@"str00: %@", str00);

 

 //寫入URL

 //將本地文件路徑轉換成url

 NSURL *url = [NSURL fileURLWithPath:filePath];

 [@"hi everyOne" writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];


 

 

 NSString *str00 = @"hello";

 NSString *str01 = @"Hello";

 

 //判斷兩個字符串內容是否一樣

 if ([str00 isEqualToString:str01]) {

 NSLog(@"內容一樣");

 }

 else{

 NSLog(@"內容不一樣");

 }

 

 //判斷兩個字符串地址是否相同,如果地址相同,那麼內容一定相同

 if (str00 == str01) {

 NSLog(@"地址相同");

 }

 else{

 NSLog(@"地址不相同");

 }

 

 */


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是可以異步工作的。可以註冊一個在流中有字節可讀的時候回調的函數,如果沒有可讀的,就不要阻塞住,回調出去。

Baidu Button BEGIN



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章