web-dev-qa-db-ja.com

NSFileManagerの一意のファイル名

IOSで一意のファイル名を持つファイルをすばやく簡単に保存する方法が必要です。ファイルの先頭に文字列を付けて、生成された一意の識別子を最後に追加する必要があります。私はNSFileManagerにこれを行うための便利な方法があることを望んでいましたが、それを見つけることができないようです。

createFileAtPath:contents:attributes:、しかし属性が私にそのユニークなファイル名を与えるかどうかわかりません。

41
spentak

独自のファイル名を作成します。

CFUUIDRef uuid = CFUUIDCreate(NULL);
CFStringRef uuidString = CFUUIDCreateString(NULL, uuid);
CFRelease(uuid);
NSString *uniqueFileName = [NSString stringWithFormat:@"%@%@", prefixString, (NSString *)uuidString];
CFRelease(uuidString);

コメントで@darrinmによって提案されたより簡単な代替案:

NSString *prefixString = @"MyFilename";

NSString *guid = [[NSProcessInfo processInfo] globallyUniqueString] ;
NSString *uniqueFileName = [NSString stringWithFormat:@"%@_%@", prefixString, guid];

NSLog(@"uniqueFileName: '%@'", uniqueFileName);

NSLog出力:
uniqueFileName: 'MyFilename_680E77F2-20B8-444E-875B-11453B06606E-688-00000145B460AF51'

注:iOS6では、CFUUIDの代わりに使用できるNSUUIDクラスが導入されました。

NSString *guid = [[NSUUID new] UUIDString];
77
zaph

現在の日付を使用して、特定の拡張子を持つランダムなファイル名を生成します。これは私のNSFileManagerカテゴリのメソッドの1つです。

 +(NSString *)generateFileNameWithExtension:(NSString *)extensionString 
 {
 //拡張文字列は@ "。png" 
 
のようになりますNSDate * time = [NSDate date]; 
 NSDateFormatter * df = [NSDateFormatter new]; 
 [df setDateFormat:@ "dd-MM-yyyy-hh-mm-ss"]; 
 NSString * timeString = [df stringFromDate:time]; 
 NSString * fileName = [NSString stringWithFormat:@ "File-%@%@"、timeString、extensionString]; 
 
 return fileName; 
} 
9
Denis Kutlubaev

由緒あるmktemp()を使用することもできます(_man 3 mktemp_を参照)。このような:

_- (NSString*)createTempFileNameInDirectory:(NSString*)dir
{
  NSString* templateStr = [NSString stringWithFormat:@"%@/filename-XXXXX", dir];
  char template[templateStr.length + 1];
  strcpy(template, [templateStr cStringUsingEncoding:NSASCIIStringEncoding]);
  char* filename = mktemp(template);

  if (filename == NULL) {
    NSLog(@"Could not create file in directory %@", dir);
    return nil;
  }
  return [NSString stringWithCString:filename encoding:NSASCIIStringEncoding];
}
_

XXXXXは、一意の文字/数字の組み合わせに置き換えられます。これらはテンプレートの最後にのみ表示できるため、テンプレートに拡張子を追加することはできません(ただし、一意のファイル名を取得した後で追加することはできます)。テンプレートに必要なだけXを追加します。

ファイルは作成されません。自分で作成する必要があります。同じディレクトリに一意のファイルを作成する複数のスレッドがある場合、競合状態が発生する可能性があります。この場合は、mkstemp()を使用してファイルを作成し、ファイル記述子を返します。

7
ovidiu

IOS 6では、最も簡単な方法は以下を使用することです。

NSString *uuidString = [[NSUUID UUID] UUIDString];
5
Reefwing

Swift 3.0

public func generateUniqueFilename (myFileName: String) -> String {

    let guid = ProcessInfo.processInfo.globallyUniqueString
    let uniqueFileName = ("\(myFileName)_\(guid)")

    print("uniqueFileName: \(uniqueFileName)")

    return uniqueFileName
}
5
Dave Levy

超簡単Swift 4 1-liner:

fileName = "MyFileName_" + UUID().uuidString

または

fileName = "MyFileName_" + ProcessInfo().globallyUniqueString
4
drewster

Swift 4.2、私は2つのオプションを使用します。1つはほとんど一意ですが、読み取り可能です。

// Create a unique filename, added to a starting string or not
public func uniqueFilename(filename: String = "") -> String {
    let uniqueString = ProcessInfo.processInfo.globallyUniqueString
    return filename + "-" + uniqueString
}

// Mostly Unique but Readable ID based on date and time that is URL compatible ("unique" to nearest second)
public func uniqueReadableID(name: String = "") -> String {

    let timenow = DateFormatter.localizedString(from: Date(), dateStyle: .medium, timeStyle: .medium)
    let firstName = name + "-" + timenow
    do {
        // Make ID compatible with URL usage
        let regex = try NSRegularExpression(pattern: "[^a-zA-Z0-9_]+", options: [])
        let newName = regex.stringByReplacingMatches(in: firstName, options: [], range: NSMakeRange(0, firstName.count), withTemplate: "-")
        return newName
    }
    catch {
        print("???? Unique ID Error: \(error.localizedDescription)")
        return uniqueFilename(filename: name)
    }
}
2
Golompse

これはおそらくあなたのために働くはずです:

http://vgable.com/blog/2008/02/24/creating-a-uuid-guid-in-cocoa/

投稿の著者は、NSStringのカテゴリとして「stringWithUUID」メソッドを実装することを提案しています。このメソッドで生成されたGUIDを、作成するファイル名の最後に追加するだけです。

2
lottscarson

Swift 4.1。ファイル拡張子名を渡すだけで、関数は一意のファイル名を返します。

func uniqueFileNameWithExtention(fileExtension: String) -> String {
        let uniqueString: String = ProcessInfo.processInfo.globallyUniqueString
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyyMMddhhmmsss"
        let dateString: String = formatter.string(from: Date())
        let uniqueName: String = "\(uniqueString)_\(dateString)"
        if fileExtension.length > 0 {
            let fileName: String = "\(uniqueName).\(fileExtension)"
            return fileName
        }

        return uniqueName
    }
1
Gurjinder Singh