ikeh1024のブログ

ZennやQiitaに書くにはちょっと小粒なネタをこちらに書いています

NSURLのメモ_01

(随時更新)

既にファイルが存在している場合に、重複しないパスを取得する

  • 下記の流れで再帰的に呼び出している。
  • まだURLが存在する場合
    • 入力URLをそのまま帰す
  • 既にURLが存在する場合
    • 末尾に_copyを付けて再帰的に呼び出す
/**
 @brief 重複していない出力ファイルのパスを取得する
        (e.g. sample.txt(既に存在する場合) -> sample_copy.txt)
 */
- (NSURL *)getNonOverlappingUrl:(NSURL *)url {
    NSURL   *nonOverlappingURL = url;
    NSError *error             = nil;
    if ([url checkResourceIsReachableAndReturnError:&error]) {  // ファイルが既に存在する場合はリネームする
        NSString *lastPathComponent = [url lastPathComponent];
        
        NSString *name      = [lastPathComponent stringByDeletingPathExtension];
        NSString *extension = [lastPathComponent pathExtension];
        NSString *newName   = [NSString stringWithFormat:@"%@_copy.%@", name, extension];
        nonOverlappingURL = [nonOverlappingURL.URLByDeletingLastPathComponent URLByAppendingPathComponent:newName];
        nonOverlappingURL = [self getNonOverlappingUrl:nonOverlappingURL];
    }
    return nonOverlappingURL;
}
  • 呼び出し例
NSURL *sample    = [NSURL fileURLWithPath:@"/Users/.../Desktop/sample.txt"];
NSURL *newSample = [self getNonOverlappingUrl:sample];
NSLog(@"%@", newSample.path);
  • 結果
/Users/.../Desktop/sample_copy.txt

ファイルを書き出す(上書き選択あり)

- (BOOL)copyMyFile:(NSURL *)input outputFolder:(NSURL *)output doOverwrite:(BOOL)overWrite;     //ファイルコピー関数。中間フォルダを作成する。またファイルの上書きの要否を選択できる
/**
 @brief ファイルコピー関数。中間フォルダを作成する。またファイルの上書きの要否を選択できる
 @param input 入力先ファイルパス
 @param output 出力先ファイルパス
 @param overWrite ファイルの上書きを行うかどうか
 @return 正常終了でYES
 */
- (BOOL)copyMyFile:(NSURL *)input output:(NSURL *)output doOverwrite:(BOOL)overWrite{
    
    NSFileManager   *fileManager = [NSFileManager defaultManager];
    NSError         *error = nil;
    // フォルダが無ければ作成する
    NSURL *outputFolder = [output URLByDeletingLastPathComponent];
    if (NO == [fileManager fileExistsAtPath:[outputFolder path]]) {
        [fileManager createDirectoryAtPath:[output path] withIntermediateDirectories:YES attributes:nil error:&error];
    }
    // ファイルが既に存在している場合
    if (YES == [fileManager fileExistsAtPath:[output path]]) {
        if (YES == overWrite) {     // 上書きするオプションがYESの場合、ファイルを削除する
            NSError *removeError = nil;
            [fileManager removeItemAtURL:output error:&removeError];
            if (removeError) {
                NSLog(@"%@", [removeError localizedDescription]);
                return NO;
            }
        } else {
            return YES;             // 上書きするオプションがNOの場合、何も行わない
        }
    }
    // ファイルをコピーする
    NSError *copyError = nil;
    [fileManager copyItemAtURL:input
                         toURL:output
                         error:&copyError];
    if (copyError) {
        NSLog(@"%@", [copyError localizedDescription]);
    }
    return YES;
}

ファイルの読み込み

テキストファイルの読み込み

/**
 @brief 指定したローカルファイルURLのテキストファイルを読み込む
 @param file テキストファイルのフルパス
 @return NSString テキストファイルの文字れる
 */
- (NSString *)readTextFile:(NSURL*)file {
    NSError  *error = nil;
    NSString *contents = [NSString stringWithContentsOfURL:file
                                                  encoding:NSUTF8StringEncoding
                                                     error:&error];
    if (error) {
        NSLog(@"%@", error.localizedDescription);
        return @"";
    }
    return contents;
}
  • 呼び出し例とログ
NSString *path = @"~/Desktop/sample.txt";
path = [path stringByExpandingTildeInPath];
NSLog(@"%@", [self readTextFile:[NSURL fileURLWithPath:path]]);

JSONファイルの読み込み

/**
 @brief JSONファイルを読み込む
 @param jsonFile JSON形式のファイル
 @return Dictionary
 */
- (NSDictionary *)loadJsonFile:(NSURL *)jsonFile {
    NSError      *error = nil;
    NSData       *data  = [NSData dataWithContentsOfURL:jsonFile];
    NSDictionary *dic   = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
    if (error) {
        NSLog(@"%@\r\n上記ファイルの読み込みに失敗しました。%@", jsonFile.path, error.localizedDescription);
        [NSApp terminate:self];
    }
    return dic;
}