2016-07-05 2 views
2

私は基本的にすべてNSLog'sをファイルに書き込むプロセスを含むアプリケーションを開発しました。ログはファイルに完全に書き込まれます。私の質問は、次のファイルが作成された後のファイルのサイズに制限を設定することができます。はいの場合、どうすればいいですか。objective-cを使ってアプリケーションにファイルローテーションを含める方法

これは、アプリケーションデリゲートの最初の既存のコードです。ここで

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

ログファイルの場合は、[CocoaLumberjack](https://github.com/CocoaLumberjack/CocoaLumberjack)を使用してください。 – Droppy

答えて

0

まず、ロギング作業を行う関数を作成する必要があります。ログを記録するたびにファイル操作を行うのではなく、常に同じ機能を作成することをお勧めします。

この機能では、ファイルのサイズを見つけるために以下のコードを使用します。

NSDictionary *fileDictionary = [[NSFileManager defaultManager] fileAttributesAtPath:your_file_path traverseLink:YES]; 
fileSize = [fileDictionary fileSize]; 

このfileSizeが許容サイズより大きい場合は、NSFileManagerのmove関数で名前を変更します。ロギング目的で同じ名前の新しいファイルを同じ場所に作成します。

+0

もう少し明確になることができますか?私はNSFileManagerの移動機能で明確ではない@Apurv –

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; 
} 
+0

あなたはローマのコードを説明してくださいできますか? –

+0

パスでファイルを監視し、ファイルサイズを確認し、何をしたいのかを明確にしていないか、内部のバリアントを指定します(ファイルが限界に達したときにファイルを切り捨てることができます.....) –

+0

私はデータを書き込むファイルを持っています。ファイルが特定の制限に達したときに新しいファイルを作成したいのですが、2番目のファイルがその制限に達すると、ファイル1を切り捨てて再度書き始めます。だから基本的に私は2つのファイルを使って作業したいと思います –

関連する問題