在AppDelegate.m的** application: didFinishLaunchingWithOptions**中:
#if (DEBUG == 1 || TARGET_OS_SIMULATOR)
#else
#ifdef FILELOG_SUPPORT
[self redirectNSlogToDocumentFolder];
#endif
#endif```
// 將NSlog打印信息保存到Document目錄下的文件中
- (void)redirectNSlogToDocumentFolder
{
//document文件夾
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [paths objectAtIndex:0];
//
NSString *foldPath = [documentDirectory stringByAppendingFormat:@"/appLog"];
//文件保護(hù)等級
NSDictionary *attribute = [NSDictionary dictionaryWithObject:NSFileProtectionNone
forKey:NSFileProtectionKey];
[[NSFileManager defaultManager] createDirectoryAtPath:foldPath withIntermediateDirectories:YES attributes:attribute error:nil];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"]];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; //每次啟動(dòng)后都保存一個(gè)新的日志文件中
NSString *dateStr = [formatter stringFromDate:[NSDate date]];
NSString *logFilePath = [foldPath stringByAppendingFormat:@"/%@.log",dateStr];
[Utils checkFlieProtection:logFilePath];
// 將log輸入到文件
freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stdout);
freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);
}
pragma mark -File Handel
- (void)checkFlieProtection:(NSString *)path {
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *pathSqlite = path;
NSDictionary *attributeSql = [fileManager attributesOfItemAtPath:pathSqlite error:nil];
if ([[attributeSql objectForKey:NSFileProtectionKey] isEqualToString:NSFileProtectionComplete]) {
NSDictionary *attribute = [NSDictionary dictionaryWithObject:NSFileProtectionCompleteUntilFirstUserAuthentication
forKey:NSFileProtectionKey];
[fileManager setAttributes:attribute ofItemAtPath:pathSqlite error:nil];
NSLog(@"改變文件權(quán)限 %@ : %@",path,attribute);
}
}
### Tips
- 文件保護(hù)等級屬性列表
NSFileProtectionNone //文件未受保護(hù),隨時(shí)可以訪問 (Default)
NSFileProtectionComplete //文件受到保護(hù)衩婚,而且只有在設(shè)備未被鎖定時(shí)才可訪問
NSFileProtectionCompleteUntilFirstUserAuthentication //文件收到保護(hù)钢属,直到設(shè)備啟動(dòng)且用戶第一次輸入密碼
NSFileProtectionCompleteUnlessOpen //文件受到保護(hù)鞋吉,而且只有在設(shè)備未被鎖定時(shí)才可打開,不過即便在設(shè)備被鎖定時(shí)荸频,已經(jīng)打開的文件還是可以繼續(xù)使用和寫入
- freopen
[freopen()函數(shù)](http://c.biancheng.net/cpp/html/2508.html)用于文件流的的重定向狈谊,一般是將 stdin、stdout 和 stderr 重定向到文件籽腕。
所謂重定向,就是改變文件流的源頭或目的地塘砸。stdout(標(biāo)準(zhǔn)輸出流)的目的地是顯示器节仿,printf()是將流中的內(nèi)容輸出到顯示器;可以通過freopen()將stdout 的目的地改為一個(gè)文件(如output.txt)掉蔬,再調(diào)用 printf()廊宪,就會(huì)將內(nèi)容輸出到這個(gè)文件里面,而不是顯示器女轿。 freopen()函數(shù)的原型為: FILE *freopen(char *filename, char *type, FILE *stream);