22

为什么如果我使用NSTemporaryDirectory保存我的图像,图像被保存到

/var/folders/oG/oGrLHcAUEQubd3CBTs-1zU+++TI/-Tmp-/

而不是进入

/Users/ MyMac /Library/Application Support/iPhone Simulator/4.3.2/Applications/A685734E-36E9-45DD-BBE7-0A46F8F91DAF/tmp

这是我的代码:

-(NSString *)tempPath
{
    return NSTemporaryDirectory();
}

-(void) saveMyFoto
{
    NSString *urlNahledu = [NSString stringWithFormat:@"%@%@%@",@"http://www.czechmat.cz", urlFotky,@"_100x100.jpg"];
    NSLog(@"%@", urlNahledu);


    UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:urlNahledu]]];

    NSData *data = [NSData dataWithData:UIImageJPEGRepresentation(image, 0.8f)];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSLog(@"%@    %@", paths, [self tempPath]);

    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *localFilePath = [documentsDirectory stringByAppendingPathComponent:@"pkm.jpg"];

    [data writeToFile:localFilePath atomically:YES];
}
4

4 回答 4

52

这是首选方法,它使用 URL 直接获取到 tmp 目录的链接,然后返回该目录的文件 URL (pkm.jpg):

斯威夫特 4.1

let url = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true)
    .appendingPathComponent("pkm", isDirectory: false)
    .appendingPathExtension("jpg")

// Then write to disk
if let data = UIImageJPEGRepresentation(image, 0.8) {
    do {
        try data.write(to: url)
    } catch {
        print("Handle the error, i.e. disk can be full")
    }
}

斯威夫特 3.1

let tmpURL = try! URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true)
                    .appendingPathComponent("pkm")
                    .appendingPathExtension("jpg")
print("Filepath: \(tmpURL)")

请注意,不处理可能的错误!

斯威夫特 2.0

let tmpDirURL = NSURL.fileURLWithPath(NSTemporaryDirectory(), isDirectory: true)
let fileURL = tmpDirURL.URLByAppendingPathComponent("pkm").URLByAppendingPathExtension("jpg")
print("FilePath: \(fileURL.path)")

Objective-C

NSURL *tmpDirURL = [NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES];
NSURL *fileURL = [[tmpDirURL URLByAppendingPathComponent:@"pkm"] URLByAppendingPathExtension:@"jpg"];
NSLog(@"fileURL: %@", [fileURL path]);

请注意,某些方法仍将路径请求为字符串,然后使用 将[fileURL path]路径作为字符串返回(如上面 NSLog 中所示)。升级当前应用程序时,文件夹中的所有文件:

<Application_Home>/Documents/
<Application_Home>/Library/

保证从旧版本(不包括<Application_Home>/Library/Caches子目录)中保留。使用Documents您可能希望用户有权访问的Library文件的文件夹以及应用程序使用且用户不应该看到的文件的文件夹。


另一种更长的方法可能是获取 tmp 目录的 url,首先获取 Document 目录并剥离最后一个路径组件,然后添加 tmp 文件夹:

NSURL *documentDir = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject];
NSURL *tmpDir = [[documentDir URLByDeletingLastPathComponent] URLByAppendingPathComponent:@"tmp" isDirectory:YES];
NSLog(@"tmpDir: %@", [tmpDir path]);

然后我们可以在那里寻址一个文件,即 pkm.jpg,如下所示:

NSString *fileName = @"pkm";
NSURL *fileURL = [tmpDir URLByAppendingPathComponent:fileName isDirectory:NO];
fileURL = [fileURL URLByAppendingPathExtension:@"jpg"];

字符串也可以做到这一点,在旧的 iOS 系统上使用的方式,但上面的第一个 URL 方法现在是推荐的(除非你正在写入旧系统:iPhone OS 2 或 3):

NSString *tmpDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
tmpDir = [[tmpDir stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"tmp"];
NSString *filePath = [[tmpDir stringByAppendingPathComponent:@"pkm"] stringByAppendingPathExtension:@"jpg"];
于 2012-08-18T23:37:46.093 回答
3

因为在模拟器中运行的应用程序并没有像在 iOS 设备中那样真正被沙盒化。在模拟器上,来自 Mac OS 的临时目录在 NSTemporaryDirectory() 中返回 - 在 iOS 设备上,临时目录实际上位于沙箱中。作为应用程序开发人员,您不应该担心这种差异。

于 2011-09-16T13:17:54.237 回答
1

Swift 5 版本的Sverrisson的答案。

    let url = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true)
        .appendingPathComponent("pkm", isDirectory: false)
        .appendingPathExtension("jpg")
    
    // Then write to disk
    if let data = image.jpegData(compressionQuality: 0.8) {
        do {
            try data.write(to: url)
        } catch {
            print("Handle the error, i.e. disk can be full")
        }
    }
于 2021-02-19T07:28:48.143 回答
-2

如果要将图像存储在 /Users/MyMac/Library/Application Support/iPhone Simulator/4.3.2/Applications/A685734E-36E9-45DD-BBE7-0A46F8F91DAF/tmp

然后使用 nshomedirectory() 为您提供位置到 /Users/MyMac/Library/Application Support/iPhone Simulator/4.3.2/Applications/A685734E-36E9-45DD-BBE7-0A46F8F91DAF 然后您只需放置 /tmp 并存储您的图像。

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                                                     NSUserDomainMask, YES); 
NSString* docDir = [paths objectAtIndex:0];
NSString* file = [docDir stringByAppendingString:@"/tmp"];
于 2011-09-16T13:33:51.090 回答