为什么如果我使用NSTemporaryDirectory
保存图像,图像会保存到
的/ var /文件夹/ 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];
}
答案 0 :(得分:49)
这是首选方法,它使用URL来直接获取tmp目录的链接,然后返回该目录的文件URL(pkm.jpg):
Swift 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")
}
}
Swift 3.1
let tmpURL = try! URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true)
.appendingPathComponent("pkm")
.appendingPathExtension("jpg")
print("Filepath: \(tmpURL)")
请注意,未处理可能的错误!
Swift 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
文件夹用于应用程序使用且用户不应看到的文件。
另一个更长的方式可能是获取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): / p>
NSString *tmpDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
tmpDir = [[tmpDir stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"tmp"];
NSString *filePath = [[tmpDir stringByAppendingPathComponent:@"pkm"] stringByAppendingPathExtension:@"jpg"];
答案 1 :(得分:3)
因为在模拟器中运行的应用程序不像iOS设备那样真正沙盒化。在模拟器上,在NSTemporaryDirectory()中返回来自Mac OS的临时目录 - 在iOS设备上,临时目录实际上位于沙箱中。 这种差异不应该与您作为应用程序开发人员有关。
答案 2 :(得分:1)
Sverrisson 答案的 Swift 5 版本。
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")
}
}
答案 3 :(得分:-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"];