2011-09-16 45 views
20

为什么,如果我用NSTemporaryDirectory救我的图像,将图像保存到如何将图像保存到我的应用程序的tmp目录中?

在/ var /文件夹/ OG/oGrLHcAUEQubd3CBTs-1zU +++ TI/-Tmp-/

而不是到

/用户/ MyMac /库/应用程序支持/ iPhone模拟器/ 4.3.2 /应用/ 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]; 
} 
+1

这篇文章解释了iOS应用程序的所有目录,保存,删除http://kmithi.blogspot.in/2012/08/ios-application-directory-structure.html – mithilesh

+0

'UIImageJPEGRepresentation()'已经返回'NSData * ' - 为什么在使用它之前将它传递给'dataWithData:'?我想知道你是否知道我不知道的东西... – ArtOfWarfare

回答

3

因为在模拟器中运行的应用程序是不是真的像沙盒在iOS设备。在模拟器上,来自Mac OS的临时目录在NSTemporaryDirectory()中返回 - 在iOS设备上,临时目录实际上位于沙箱内。 这种差异不应该让你担任应用程序开发人员。

-2

如果你想你的图像存储在/用户/ MyMac /库/应用程序支持/ iPhone模拟器/ 4.3.2 /应用/ A685734E-36E9-45DD-BBE7-0A46F8F91DAF的/ tmp

然后使用nshomedirectory( )给你的位置upto/Users/MyMac /库/应用程序支持/ iPhone模拟器/ 4.3.2 /应用程序/ A685734E-36E9-45DD-BBE7-0A46F8F91DAF然后你只需把/ tmp和存储您的图像。

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                NSUserDomainMask, YES); 
NSString* docDir = [paths objectAtIndex:0]; 
NSString* file = [docDir stringByAppendingString:@"/tmp"]; 
+5

这不起作用,并且NSHomeDirectory()的文本说明和代码使用NSDocumentDirectory因此,/ tmp目录将成为Documents目录的一部分,这是错误的。 –

47

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

雨燕4.0

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

// Then write to disk 
if let url = tmpURL, let data = UIImageJPEGRepresentation(image, 0.8) { 
    // Use do-catch for error handling, disk can be full etc. 
    try? data.write(to: url) 
} 

雨燕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)") 

目标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文件夹,查找App使用且用户看不到的文件。


另一个更长的路可能获得一个网址到tmp目录,首先,把文件目录和剥离的最后一个路径组件,然后添加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"]; 

可以使用字符串完成相同的操作,但在上面的第一个URL方法是现在推荐的方法(除非您正在写入较旧的系统:iPhone OS 2或3):

NSString *tmpDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; 
tmpDir = [[tmpDir stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"tmp"]; 
NSString *filePath = [[tmpDir stringByAppendingPathComponent:@"pkm"] stringByAppendingPathExtension:@"jpg"]; 
+0

当我是一个视频文件.mp4时,我无法从'NSTemporaryDirectory()'获取文件。适用于音频和图像。帮助 – jose920405

+0

@ jose920405我真的不明白你的问题,但它可能与该文件是否受iOS支持有关。 –

+0

'isDirectory'很重要 – onmyway133

相关问题