2010-09-08 8 views
34

У моего приложения iPad есть небольшое средство загрузки, для которого я хочу добавить данные с помощью NSFileHandle. Проблема заключается в том, что вызов create возвращает только файлы с нулевым файлом. В чем может быть проблема? Вот три строки кода, которые должны создать свой дескриптор файла:NSFileHandle fileHandleForWritingAtPath: return null!

NSString *applicationDocumentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
self.finalPath = [applicationDocumentsDirectory stringByAppendingPathComponent: self.fileName]; 
NSFileHandle *output = [NSFileHandle fileHandleForWritingAtPath:self.finalPath]; 

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

TYIA

ответ

83

fileHandleForWritingAtPath не является «создание» вызов. В документации явно указано: «Возвращаемое значение: инициализированный дескриптор файла или nil, если файл не существует на пути» (выделено мной). Если вы хотите создать файл, если он не существует, вы должны были бы использовать что-то вроде этого:

NSFileHandle *output = [NSFileHandle fileHandleForWritingAtPath:self.finalPath]; 
if(output == nil) { 
     [[NSFileManager defaultManager] createFileAtPath:self.finalPath contents:nil attributes:nil]; 
     output = [NSFileHandle fileHandleForWritingAtPath:self.finalPath]; 
} 

Если вы хотите добавить в файл, если он уже существует, использовать что-то вроде [output seekToEndOfFile]. Ваш полный код будет выглядеть следующим образом:

NSString *applicationDocumentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
self.finalPath = [applicationDocumentsDirectory stringByAppendingPathComponent: self.fileName]; 
NSFileHandle *output = [NSFileHandle fileHandleForWritingAtPath:self.finalPath]; 
if(output == nil) { 
     [[NSFileManager defaultManager] createFileAtPath:self.finalPath contents:nil attributes:nil]; 
     output = [NSFileHandle fileHandleForWritingAtPath:self.finalPath]; 
} else { 
     [output seekToEndOfFile]; 
} 
+0

Мой файл существует в «/ Var/мобильный/Контейнеры/Data/Application/E914726C-34B7-4B92- A740-90E31131D75E/Library/Caches/"но я все равно получаю нуль. – Nilesh

0

Получить документы путь к каталогу

+(NSURL *)getDocumentsDirectoryPath 
{ 
    return [[[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]lastObject]; 
} 

Сохранить текст в конец файла

если файл оленья кожа существует создать его и написать данные

+(void)saveText:(NSString *)textTobeSaved atPath:(NSString*)fileName 
{ 
    NSString *filePath = [NSString stringWithFormat:@"%@.text",fileName]; 

    NSString *path = [[self getDocumentsDirectoryPath].path 
         stringByAppendingPathComponent:filePath]; 
    NSFileHandle *fileHandler = [NSFileHandle fileHandleForWritingAtPath:path]; 
    if(fileHandler == nil) { 
     [[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil]; 
     fileHandler = [NSFileHandle fileHandleForWritingAtPath:path]; 
    } else { 
     textTobeSaved = [NSString stringWithFormat:@"\n-----------------------\n %@",textTobeSaved]; 
     [fileHandler seekToEndOfFile]; 
    } 

    [fileHandler writeData:[textTobeSaved dataUsingEncoding:NSUTF8StringEncoding]]; 
    [fileHandler closeFile]; 
} 

получить текст из файла с указанным именем

+(NSString *)getTextFromFilePath:(NSString *)fileName 
{ 
    NSString *filePath = [NSString stringWithFormat:@"%@.text",fileName]; 

    NSString *path = [[self getDocumentsDirectoryPath].path 
         stringByAppendingPathComponent:filePath]; 
    NSLog(@"%@",path); 
    if(path!=nil) 
    { 
    NSString *savedString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; 

    return savedString; 
    }else{ 
    return @""; 
    } 
} 

Удал.файла

+(void)deleteFile:(NSString *)fileName 
{ 
    NSString *filePath = [NSString stringWithFormat:@"%@.text",fileName]; 

    NSString *path = [[self getDocumentsDirectoryPath].path 
         stringByAppendingPathComponent:filePath]; 

    NSFileHandle *fileHandler = [NSFileHandle fileHandleForWritingAtPath:path]; 
    if(fileHandler != nil) { 
     [[NSFileManager defaultManager]removeItemAtPath:path error:nil]; 
    } 

}