我开发了一个应用程序,基本上包括将所有NSLog's
写入文件的过程。并且日志完美地写入文件。我的问题是我可以设置文件大小的限制,然后创建下一个文件,如果是,我该怎么做。
这是我在app delegate开头的现有代码。
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fileName =[NSString stringWithFormat:@"Logger.txt"];
NSString *logFilePath = [documentsDirectory stringByAppendingPathComponent:fileName];
freopen([logFilePath cStringUsingEncoding:NSUTF8StringEncoding],"a+",stderr);
此处,logger.txt
文件已完美创建,但我希望限制文件可容纳的大小。我也尝试过搜索它但找不到解决方案。
任何帮助都会有很大的帮助。
答案 0 :(得分:0)
首先,您需要创建一个函数来执行日志记录活动。不是每次要记录时都进行文件操作,而是始终建议为它创建一个函数。
在此函数中使用下面的代码来查找文件的大小。
NSDictionary *fileDictionary = [[NSFileManager defaultManager] fileAttributesAtPath:your_file_path traverseLink:YES];
fileSize = [fileDictionary fileSize];
如果此fileSize大于允许的大小,则使用NSFileManager的move函数重命名它。在同一位置创建一个原始名称的新文件,以便记录。
答案 1 :(得分:0)
// example iOS project
// https://github.com/solodyashkin/OSLog
// save source in class to cancel before file will be replaced
dispatch_source_t source = [XClass monitorFileAtPath:path
withEventHandler:^(){
// fastest way to get file size
struct stat st;
if ( lstat( path.UTF8String, &st ) < 0 )
{
// fail to get file size
}
else
{
// limit to 2MB
// NSLog(@"log file size in bytes %lld", st.st_size);
if ( st.st_size > 1024 * 1024 * 2 )
{
// TODO:
// dispatch_source_cancel(source);
// reopen to new filename
// or copy log file
// or ftruncate(STDOUT_FILENO, 0);
// loop...
}
}
}
queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
+ (dispatch_source_t)monitorFileAtPath:(NSString*)path withEventHandler:(dispatch_block_t)block queue:(dispatch_queue_t)queue
{
int fildes = open([path UTF8String], O_EVTONLY);
dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_VNODE, fildes,
DISPATCH_VNODE_WRITE | DISPATCH_VNODE_EXTEND,
queue);
dispatch_source_set_event_handler(source, block);
dispatch_source_set_cancel_handler(source, ^{
close(fildes);
});
dispatch_resume(source);
return source;
}