2013-06-19 4 views
2

Я пытаюсь сэкономить NSMutableDictionary в applicationDidEnterBackground от AppDelegate.m до plist. Сразу же после его сохранения я пытаюсь проверить, существует ли файл и прочитать его, но файл не найден.Чтение и письмо NSMutableDictionary в файл plist

NSString *photoCacheFilename = @"photoCache.plist"; 
[photoDict writeToFile:photoCacheFilename atomically:YES]; 
NSLog(@"File name: %@", photoCacheFilename); 
BOOL isFile = [[NSFileManager defaultManager] fileExistsAtPath:photoCacheFilename]; 
if(isFile) 
{ 
    NSLog (@"File found"); 
    NSMutableDictionary *newDictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:photoCacheFilename]; 
} 
else 
{ 
    NSLog (@"File not found"); 
} 

Я изменил код, как предложили некоторые пользователи, но файл не найден. Я не уверен, правильно ли я проверял наличие файла.

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsPath = [paths objectAtIndex:0]; 
NSString *photoCacheFilename = [documentsPath stringByAppendingPathComponent:@"photoCache.plist"]; 

[photoDict writeToFile:photoCacheFilename atomically:YES]; 

BOOL isFile = [[NSFileManager defaultManager] fileExistsAtPath:photoCacheFilename]; 
if(isFile) 
{ 
    NSLog (@"File found"); 
    NSMutableDictionary *newDictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:photoCacheFilename]; 
} 
else 
{ 
    NSLog (@"File not found"); 
} 
+0

photoCacheFilename должен быть complate путь не только имя файла .. – bhawesh

+0

Я попробовал полный путь, как показано ниже, но все тот же результат: NSString * photoCacheFilename = [@ "~/Документы/photoCache.plist" stringByExpandingTildeInPath]; – kzia

+0

получите полный путь, как он делает в ответ на этот вопрос [1]. [1]: http://stackoverflow.com/questions/9433598/write-into-plist-file-using-nsdictionary-object – keen

ответ

4

Вы не указав правильный путь к каталогу Documents

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

NSString *photoCacheFilename = [documentsPath stringByAppendingPathComponent:@"photoCache.plist"]; // Correct path to Documents Dir in the App Sand box 

[photoDict writeToFile:photoCacheFilename atomically:YES]; //Write 
+0

см. Мои правки в вопросе. – kzia

+0

hmm, можно проверить, '' writeToFile' возвращает 'true' или' false'? –

+0

'writeToFile' терпел неудачу. Похоже, что словарь, который я пытаюсь написать, содержит типы данных, которые не могут быть записаны в файл plist. Спасибо за помощь. – kzia

1

Вы должны указать полный путь для сохранения данных:

NSString *myFile = @"myFile.plist"; 
NSArray *filePaths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [filePaths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:myFile]; 
[photoDict writeToFile:path atomically:YES]; 
+0

см. Мои правки в вопросе. – kzia

+0

кажется правильным для меня ... попробуйте создать свой изменяемый словарь без проверки существования вашего файла, поставить точку останова и проверить его значение в области отладки. – zbMax

+0

'writeToFile' терпел неудачу. Похоже, что словарь, который я пытаюсь написать, содержит типы данных, которые не могут быть записаны в файл plist. Спасибо за помощь. – kzia

0

В СВИФТ 3,0

Чтобы получить путь к файлу fileCache.plist, который находится в каталоге документа.

func getPath() -> String { 
     let plistFileName = "photoCache.plist" 
     let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) 
     let documentPath = paths[0] as NSString 
     let plistPath = documentPath.appendingPathComponent(plistFileName) 
     return plistPath 
    } 

Чтобы проверить, существует ли файл или нет.

let plistPath = self.getPath() 
if FileManager.default.fileExists(atPath: plistPath) { 
    //File Exists 
} 
Смежные вопросы