2013-11-30 3 views
1

Я пытаюсь сохранить и извлечь файл из папки в каталоге документов. Я получить его таким образом:Сохранение и извлечение файлов из папки в каталоге документов IOS

NSFileManager *fManager = [NSFileManager defaultManager]; 
    NSString *item; 
    NSString *docsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
    NSArray *contents = [fManager contentsOfDirectoryAtPath:[NSString stringWithFormat:@"%@", docsPath] error:nil]; 

и сохранить его как это:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

    NSString* BusinessCardPath = [documentsDirectory stringByAppendingPathComponent: [NSString stringWithFormat:@"BusinessCard%lld.card", arc4random() % 100000000000000]]; 

По какой-то причине, если я:

NSArray *contents = [fManager contentsOfDirectoryAtPath:[NSString stringWithFormat:@"%@/FOLDER", docsPath] error:nil]; 

и

NSString* BusinessCardPath = [documentsDirectory stringByAppendingPathComponent: [NSString stringWithFormat:@"FOLDER/BusinessCard%lld.card", FolderNumber, arc4random() % 100000000000000]]; 

It не открывает или не показывает файл, но когда я регистрирую два i t показывает тот же каталог. Это как вы используете папки в IOS? Пожалуйста, помогите, я пойду с ума!

ответ

4

Думаю, вы используете NSFileManager ни для чего. это путает, как вы храните и используете свои данные. Вот класс, который вы можете использовать для загрузки, хранения и удаления данных в NSDocumentDirectory:

DKStoreManager.h

@interface DKStoreManager : NSObject 

+ (NSArray *)loadBusinessCardContentForKey:(NSString *)key; 
+ (void)storeBusinessCardContent:(NSArray *)content forKey:(NSString *)key; 
+ (void)removeBusinessCardForKey:(NSString *)key; 

@end 

DKStoreManager.m

@interface DKStoreManager() { 
    NSString * _rootPath; 
} 
@end 

@implementation DKStoreManager 

- (id)init { 
    self = [super init]; 
    if (self) { 
     // get the root path of the Document Directory 
     // NSCacheDirectory is also good to use 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     _rootPath = [paths objectAtIndex:0]; 
    } 
    return self; 
} 

+ (DKStoreManager *)sharedInstance { 
    static DKStoreManager *sharedInstance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedInstance = [[DKStoreManager alloc] init]; 
    }); 
    return sharedInstance; 
} 

#pragma mark - storing management methods 

// store a data into a file in a specific sub directory 
- (id)storeObject:(id)object inFile:(NSString *)filename inDirectory:(NSString *)directory { 
    NSString *fullPath = [_rootPath stringByAppendingPathComponent:directory]; 
    if (![[NSFileManager defaultManager] fileExistsAtPath:fullPath]) 
     [[NSFileManager defaultManager] createDirectoryAtPath:fullPath withIntermediateDirectories:YES attributes:nil error:nil]; 

    fullPath = [fullPath stringByAppendingPathComponent:filename]; 
    BOOL result = [NSKeyedArchiver archiveRootObject:object toFile:fullPath]; 
    if (result) 
     NSLog(@"Successfully saved %@/%@", directory, filename); 
    else 
     NSLog(@"ERROR: can't save %@/%@", directory, filename); 

    return (result ? object : nil); 
} 

// remove a file in a specific sub directory 
- (void)removeFile:(NSString *)filename inDirectory:(NSString *)directory { 
    NSString *fullPath = [_rootPath stringByAppendingPathComponent:directory]; 
    if (![[NSFileManager defaultManager] fileExistsAtPath:fullPath]) 
     return ; 

    fullPath = [fullPath stringByAppendingPathComponent:filename]; 
    NSError *error = [NSError new]; 
    if ([[NSFileManager defaultManager] removeItemAtPath:fullPath error:&error]) 
     NSLog(@"Successfully removed %@/%@", directory, filename); 
    else 
     NSLog(@"ERROR: can't remove %@/%@ : %@", directory, filename, [error localizedDescription]); 
} 

// get the data stored into a file 
- (id)loadObjectInFile:(NSString *)filename inDirectory:(NSString *)directory { 
    NSString *fullPath = [_rootPath stringByAppendingPathComponent:directory]; 
    if (![[NSFileManager defaultManager] fileExistsAtPath:fullPath]) 
     return nil; 

    fullPath = [fullPath stringByAppendingPathComponent:filename]; 
    return [NSKeyedUnarchiver unarchiveObjectWithFile:fullPath]; 
} 

#pragma mark - business cards methods 

+ (NSArray *)loadBusinessCardContentForKey:(NSString *)key { 
    DKStoreManager *storeManager = [DKStoreManager sharedInstance]; 
    return [storeManager loadObjectInFile:key inDirectory:@"business_cards"]; 
} 

+ (void)storeBusinessCardContent:(NSArray *)content forKey:(NSString *)key { 
    DKStoreManager *storeManager = [DKStoreManager sharedInstance]; 
    [storeManager storeObject:content inFile:key inDirectory:@"business_cards"]; 
} 

+ (void)removeBusinessCardForKey:(NSString *)key { 
    DKStoreManager *storeManager = [DKStoreManager sharedInstance]; 
    [storeManager removeFile:key inDirectory:@"business_cards"]; 
} 

@end 

Я не очень понимаю, что вы хотите сделать, но хороший способ использовать этот класс может быть:

NSArray *contents = [DKStoreManager loadBusinessCardContentForKey:aBusinessCard.name]; 
[DKStoreManager storeBusinessCardContent:aContent forKey:aBusinessCard.name]; 
[DKStoreManager removeBusinessCardForKey:aBusinessCard.name]; 

Кстати, вы можете хранить любые данные/объекты, которые вы хотите с этим классом: NSArray, NSDictionnary, ... и даже ваш собственный класс, единственное, что вам нужно сделать, это реализовать NSCoding protocol

+0

Этот код был чрезвычайно полезен! ! Спасибо :)) 1up – Alessandro

Смежные вопросы