数年前にC#で作業していたときに、一時ファイルを簡単に作成し、次の関数でその名前を取得できました。
Path.GetTempFileName();
この関数は、一時ディレクトリに一意の名前のファイルを作成し、そのファイルへのフルパスを返します。
Cocoa APIで、私が見つけることができる最も近いものは次のとおりです。
NSTemporaryDirectory
私は明白な何かを見逃していますか、これを行うための組み込みの方法はありませんか?
安全な方法は mkstemp(3) を使用することです。
[注:これはMac OS SDKではなくiPhone SDKに適用されます]
私が知ることができることから、これらの関数はSDKに存在しません(unistd.h
ファイルは、標準のMac OS X 10.5ファイルと比較すると、大幅に削減されています。私は次の線に沿って何かを使用します:
[NSTemporaryDirectory() stringByAppendingPathComponent: [NSString stringWithFormat: @"%.0f.%@", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"txt"]];
きれいではありませんが、機能的です
アップルは、一時ディレクトリにアクセスし、一時ファイルに一意の名前を作成するための優れた方法を提供しています。
- (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
それから1年近く経ちますが、マットギャラガーによるCocoa With Loveのブログ投稿について言及することは、まだ役に立ちます。 http://cocoawithlove.com/2009/07/temporary-files-and-folders-in-cocoa.html 彼はmkstemp()
はファイル、mkdtemp()
はディレクトリで、NSString変換が完了しています。
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:
を使用してファイルを作成するように簡単に調整できます。
IOS 6.0またはMac OS X 10.8以降を対象とする場合:
NSString *tempFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSUUID UUID] UUIDString]];
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)
mktemp を使用して一時ファイル名を取得できます。
これを行う最新の方法は、FileManager
の- url(for:in:appropriateFor:create:)
です。
この方法では、 SearchPathDirectory
を指定して、必要な一時ディレクトリの種類を正確に指定できます。たとえば、.cachesDirectory
は(可能な限り)実行間で持続し、ユーザーのライブラリに保存されますが、.itemReplacementDirectory
はターゲットファイルと同じボリュームにあります。
NSTask
からuuidgen
を使用して一意のファイル名を取得し、それをNSTemporaryDirectory()
から文字列に追加できます。これはCocoa Touchでは機能しません。少し長めですが。
@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;
}