(随時更新)
既にファイルが存在している場合に、重複しないパスを取得する
/** @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:©Error]; 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; }