如何使用objective-c在app中包含文件轮换

时间:2016-07-05 11:03:29

标签: ios objective-c nsfilemanager filesize

我开发了一个应用程序,基本上包括将所有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文件已完美创建,但我希望限制文件可容纳的大小。我也尝试过搜索它但找不到解决方案。

任何帮助都会有很大的帮助。

2 个答案:

答案 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;
}