web-dev-qa-db-ja.com

Cocoaで一時ファイルを作成するにはどうすればよいですか?

数年前にC#で作業していたときに、一時ファイルを簡単に作成し、次の関数でその名前を取得できました。

Path.GetTempFileName();

この関数は、一時ディレクトリに一意の名前のファイルを作成し、そのファイルへのフルパスを返します。

Cocoa APIで、私が見つけることができる最も近いものは次のとおりです。

NSTemporaryDirectory

私は明白な何かを見逃していますか、これを行うための組み込みの方法はありませんか?

40
lfalin

安全な方法は mkstemp(3) を使用することです。

34
user23743

[注:これはMac OS SDKではなくiPhone SDKに適用されます]

私が知ることができることから、これらの関数はSDKに存在しません(unistd.hファイルは、標準のMac OS X 10.5ファイルと比較すると、大幅に削減されています。私は次の線に沿って何かを使用します:

[NSTemporaryDirectory() stringByAppendingPathComponent: [NSString stringWithFormat: @"%.0f.%@", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"txt"]];

きれいではありませんが、機能的です

20
Ben Gottlieb

アップルは、一時ディレクトリにアクセスし、一時ファイルに一意の名前を作成するための優れた方法を提供しています。

- (NSString *)pathForTemporaryFileWithPrefix:(NSString *)prefix
{
    NSString *  result;
    CFUUIDRef   uuid;
    CFStringRef uuidStr;

    uuid = CFUUIDCreate(NULL);
    assert(uuid != NULL);

    uuidStr = CFUUIDCreateString(NULL, uuid);
    assert(uuidStr != NULL);

    result = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"%@-%@", prefix, uuidStr]];
    assert(result != nil);

    CFRelease(uuidStr);
    CFRelease(uuid);

    return result;
}

リンク:::: http://developer.Apple.com/library/ios/#samplecode/SimpleURLConnections/Introduction/Intro.html#//Apple_ref/doc/uid/DTS40009245 ファイルを参照:: :AppDelegate.m

16
muzz

それから1年近く経ちますが、マットギャラガーによるCocoa With Loveのブログ投稿について言及することは、まだ役に立ちます。 http://cocoawithlove.com/2009/07/temporary-files-and-folders-in-cocoa.html 彼はmkstemp()はファイル、mkdtemp()はディレクトリで、NSString変換が完了しています。

13
Quinn Taylor

NSTemporary()とグローバルに一意のIDの組み合わせを使用するNSFileManagerのカテゴリを介して、純粋なCocoaソリューションを作成しました。

ここにヘッダーファイル:

@interface NSFileManager (TemporaryDirectory)

-(NSString *) createTemporaryDirectory;

@end

そして実装ファイル:

@implementation NSFileManager (TemporaryDirectory)

-(NSString *) createTemporaryDirectory {
 // Create a unique directory in the system temporary directory
 NSString *guid = [[NSProcessInfo processInfo] globallyUniqueString];
 NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:guid];
 if (![self createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:nil]) {
  return nil;
 }
 return path;
}

@end

これにより一時ディレクトリが作成されますが、createFileAtPath:contents:attributes:ではなくcreateDirectoryAtPath:を使用してファイルを作成するように簡単に調整できます。

11
Philipp

IOS 6.0またはMac OS X 10.8以降を対象とする場合:

NSString *tempFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSUUID UUID] UUIDString]];
10
fzwo

Swift 5およびSwift 4.2

import Foundation

func pathForTemporaryFile(with prefix: String) -> URL {
    let uuid = UUID().uuidString
    let pathComponent = "\(prefix)-\(uuid)"
    var tempPath = URL(fileURLWithPath: NSTemporaryDirectory())
    tempPath.appendPathComponent(pathComponent)
    return tempPath
}

let url = pathForTemporaryFile(with: "blah")
print(url)
// file:///var/folders/42/fg3l5j123z6668cgt81dhks80000gn/T/johndoe.KillerApp/blah-E1DCE512-AC4B-4EAB-8838-547C0502E264

あるいは、Ssswiftのoneliner:

let prefix = "blah"
let url2 = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(prefix)-\(UUID())")
print(url2)
5
Bart van Kuik

mktemp を使用して一時ファイル名を取得できます。

2
Giao

これを行う最新の方法は、FileManagerの-​​ url(for:in:appropriateFor:create:) です。

この方法では、 SearchPathDirectory を指定して、必要な一時ディレクトリの種類を正確に指定できます。たとえば、.cachesDirectoryは(可能な限り)実行間で持続し、ユーザーのライブラリに保存されますが、.itemReplacementDirectoryはターゲットファイルと同じボリュームにあります。

1
Ssswift

NSTaskからuuidgenを使用して一意のファイル名を取得し、それをNSTemporaryDirectory()から文字列に追加できます。これはCocoa Touchでは機能しません。少し長めですが。

0
alextgordon

@Philippに追加:

- (NSString *)createTemporaryFile:(NSData *)contents {
    // Create a unique file in the system temporary directory
    NSString *guid = [[NSProcessInfo processInfo] globallyUniqueString];
    NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:guid];
    if(![self createFileAtPath:path contents:contents attributes:nil]) {
        return nil;
    }
    return path;
}
0
SwiftArchitect