Cai*_*Cai 7 macos cocoa objective-c swift
我试图访问Swift中的临时目录.在Objective-C中,我可以使用以下代码来执行此操作:
- (NSString *)tempDirectory {
NSString *tempDirectoryTemplate =
[NSTemporaryDirectory() stringByAppendingPathComponent:@"XXXXX"];
const char *tempDirectoryTemplateCString = [tempDirectoryTemplate fileSystemRepresentation];
char *tempDirectoryNameCString = (char *)malloc(strlen(tempDirectoryTemplateCString) + 1);
strcpy(tempDirectoryNameCString, tempDirectoryTemplateCString);
char *result = mkdtemp(tempDirectoryNameCString);
if (!result) {
return nil;
}
NSString *tempDirectoryPath = [[NSFileManager defaultManager] stringWithFileSystemRepresentation:tempDirectoryNameCString length:strlen(result)];
free(tempDirectoryNameCString);
return tempDirectoryPath;
}
Run Code Online (Sandbox Code Playgroud)
但是,我对从Objective-C到Swift的类型转换和转换有点困惑,例如 const char *或CMutablePointer<CChar>.有没有我应该研究的文件?
谢谢.
Gri*_*mxn 11
怎么样的:
func createTempDirectory() -> String? {
let tempDirectoryTemplate = NSTemporaryDirectory().stringByAppendingPathComponent("XXXXX")
let fileManager = NSFileManager.defaultManager()
var err: NSErrorPointer = nil
if fileManager.createDirectoryAtPath(tempDirectoryTemplate, withIntermediateDirectories: true, attributes: nil, error: err) {
return tempDirectoryTemplate
} else {
return nil
}
}
Run Code Online (Sandbox Code Playgroud)
它没有回答你关于char*的问题但它更干净......
NSFileManager 在这里引用.
另请查看有关唯一名称的SO问题.
Swift 2.1版本:
func createTempDirectory() -> String? {
let tempDirURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent("XXXXXX")
do {
try NSFileManager.defaultManager().createDirectoryAtURL(tempDirURL, withIntermediateDirectories: true, attributes: nil)
} catch {
return nil
}
return tempDirURL.absoluteString
}
Run Code Online (Sandbox Code Playgroud)
根据 Apple 的说法,NSTemporaryDirectory不鼓励使用:
有关查找正确临时目录的首选方法,请参阅 FileManager 方法 url(for:in:propertyFor:create:)。有关临时文件的更多信息,请参阅文件系统编程指南。
所以相反,你应该使用 FileManager.default.temporaryDirectory
或者如果你想要一个独特的路径:
let extractionPath = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString, isDirectory: true)
Run Code Online (Sandbox Code Playgroud)
Swift 3 及更高版本
我认为快速执行此操作的一个好方法是使用 FileManager 上的扩展。这应该会创建一个唯一的临时文件夹并将 URL 返回给您。
extension FileManager{
func createTemporaryDirectory() throws -> URL {
let url = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(UUID().uuidString)
try createDirectory(at: url, withIntermediateDirectories: true, attributes: nil)
return url
}
}
Run Code Online (Sandbox Code Playgroud)