2011-09-16 45 views
20

Tại sao rằng nếu tôi sử dụng NSTemporaryDirectory để lưu hình ảnh của tôi, hình ảnh được lưu vàoTôi làm cách nào để lưu hình ảnh vào thư mục tmp của ứng dụng?

/var/thư mục/OG/oGrLHcAUEQubd3CBTs-1zU +++ TI/-Tmp-/

và không thành

/Users/MyMac/Library Hỗ trợ/Application/iPhone Simulator/4.3.2/Applications/A685734E-36E9-45DD-BBE7-0A46F8F91DAF/tmp

Đây là mã của tôi:

-(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

Bài đăng này giải thích tất cả thư mục ứng dụng iOS, lưu, xóa http://kmithi.blogspot.in/2012/08/ios-application-directory-structure.html – mithilesh

+0

'UIImageJPEGRepresentation()' đã trả về 'NSData * '- tại sao bạn truyền nó tới' dataWithData: 'trước khi sử dụng nó? Tôi tự hỏi nếu bạn biết điều gì đó mà tôi không ... – ArtOfWarfare

Trả lời

3

Bởi vì các ứng dụng đang chạy trong trình giả lập không thực sự sandboxed như trong các thiết bị iOS. Trên giả lập một thư mục tạm thời từ Mac OS được trả về trong NSTemporaryDirectory() - trên một thiết bị iOS, thư mục tạm thời thực sự nằm trong sandbox. Sự khác biệt đó không phải là mối quan tâm của bạn với tư cách là nhà phát triển ứng dụng.

-2

Nếu bạn muốn lưu trữ hình ảnh của bạn trong/Users/MyMac/Library/Application Support/iPhone Simulator/4.3.2/Applications/A685734E-36E9-45DD-BBE7-0A46F8F91DAF/tmp

sau đó sử dụng nshomedirectory () cung cấp cho bạn vị trí tối đa/Người dùng/MyMac/Library/Hỗ trợ ứng dụng/iPhone Simulator/4.3.2/Applications/A685734E-36E9-45DD-BBE7-0A46F8F91DAF sau đó bạn chỉ cần đặt/tmp và lưu trữ hình ảnh của mình.

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

Điều này không làm việc và các cuộc đàm thoại văn bản của NSHomeDirectory() và mã sử dụng NSDocumentDirectory do đó, thư mục/tmp sẽ là một phần của thư mục Documents là sai. –

47

Đây là phương pháp ưa thích trong đó sử dụng URL để có được một liên kết trực tiếp vào thư mục tmp và sau đó trả về một URL tập tin (pkm.jpg) cho thư mục đó:

Swift 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) 
} 

Swift 3,1

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

Lưu ý rằng một lỗi có thể không được xử lý!

Swift 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]); 

Lưu ý rằng một số phương pháp vẫn yêu cầu một con đường như chuỗi, sau đó sử dụng [fileURL path] để trả lại con đường như chuỗi (như được hiển thị ở trên trong NSLog). Khi nâng cấp một ứng dụng hiện tại tất cả các file trong thư mục:

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

được đảm bảo để được bảo quản từ phiên bản cũ (trừ <Application_Home>/Library/Caches thư mục con). Sử dụng thư mục Documents cho các tệp bạn có thể muốn người dùng có quyền truy cập và thư mục Library cho các tệp mà Ứng dụng sử dụng và Người dùng sẽ không nhìn thấy.


Một còn cách có thể để có được một địa chỉ vào thư mục tmp, bằng cách đầu tiên nhận được thư mục Document và tước các thành phần đường dẫn cuối cùng và sau đó thêm các thư mục tmp:

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

Sau đó, chúng ta có thể giải quyết một tập tin đó, tức là pkm.jpg như ở đây:

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

Có thể thực hiện tương tự với các chuỗi được sử dụng trên hệ thống iOS cũ, nhưng phương pháp URL đầu tiên ở trên là phương pháp được đề xuất ngay bây giờ (trừ khi bạn đang viết thư cho các hệ thống cũ hơn: iPhone OS 2 hoặc 3):

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

Tôi không thể tải tệp từ 'NSTemporaryDirectory()' khi tệp video là .mp4. Hoạt động hoàn hảo cho âm thanh và hình ảnh. Giúp đỡ – jose920405

+0

@ jose920405 Tôi thực sự không hiểu vấn đề của bạn, nhưng nó có thể liên quan đến việc liệu tệp có được hỗ trợ bởi iOS hay không. –

+0

'isDirectory' là quan trọng – onmyway133

Các vấn đề liên quan