3

アプリの実行ごとに単純なログ ファイルを書き込もうとしています。ログファイル名は現在の時刻に基づいており、アプリ ディレクトリに保存されます。以下のコードは私が試しているもので、シミュレーターで動作しますが、iPad で実行すると「操作が許可されていません」(errno.h の EPERM) で失敗します。

-(BOOL)CreateLogFile
{
    mLogFilePath = [self GetLogFileNameForTimeNow];
    BOOL Success = [[NSFileManager defaultManager] createFileAtPath:mLogFilePath contents:nil attributes:nil];

    /*BOOL Success = [[NSFileManager defaultManager] createFileAtPath:mLogFilePath contents:nil attributes:[NSDictionary dictionaryWithObject:NSFileProtectionComplete
                                                                                                                                     forKey:NSFileProtectionKey]];*/

    if ( Success )
    {
        NSLog( @"Successfully created file: %@", mLogFilePath );
        mLogFileHandle = [NSFileHandle fileHandleForWritingAtPath:mLogFilePath];
        [self WriteInstanceInformationToLog];
    }
    else
    {
        NSLog( @"Failed to create file: %@ %s", mLogFilePath, strerror(errno) );
    }

    return Success;
}

コメントアウトされたコードも試しましたが、それも失敗します。私はiOSプログラミングに慣れていないので、基本的なものが欠けている可能性があります。とにかく、上記の出力フォームは iPad で次のように表示されます。

2013-05-10 14:54:51.794 RichTest1[128:907] Failed to create file:
/var/mobile/Applications/XXXX/RichTest1.app/20130510145451.log Operation not permitted

しかし、シミュレータでは動作します:

2013-05-10 15:07:14.696 RichTest1[1604:c07] Successfully created file:
Users/abruce/Library/Application Support/iPhone Simulator/6.1/Applications/XXXX/RichTest1.app/20130510150714.log

どこが間違っていますか?

--edit ここにコードがありますGetLogFileNameForTimeNow

-(NSString*)GetLogFileNameForTimeNow
{
    NSString* FileName = [NSString stringWithFormat:@"%@.log", [self GetTimeAsString] ];
    NSString* AppFolderPath = [[NSBundle mainBundle] resourcePath];
    return [NSString stringWithFormat:@"%@/%@", AppFolderPath, FileName];
}

-(NSString*)GetTimeAsString
{
    return [mDateFormatter stringFromDate:[NSDate date]];
}

日付フォーマッターは、クラスのコンストラクターで次のように設定されます。

mDateFormatter = [[NSDateFormatter alloc] init];
NSString* DateFormat = @"yyyyMMddHHmmss";
[mDateFormatter setDateFormat:DateFormat];
4

3 に答える 3

1

GetLogFileNameForTimeNow 関数を次のように変更して、問題を修正しました。

-(NSString*)GetLogFileNameForTimeNow
{
    NSString* FileName = [NSString stringWithFormat:@"%@.log", [self GetTimeAsString] ];

    NSArray* Paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* DocumentsDirectory = [Paths objectAtIndex:0]; // Get documents folder
    return [NSString stringWithFormat:@"%@/%@", DocumentsDirectory, FileName];
}
于 2013-05-13T13:41:06.850 に答える