2014-01-22 3 views
1

Я пытаюсь получить свой файл в моем собственном создал каталог в каталоге документов в NSData объект, как это:Получить файл из директории в NSData

NSString *path = [documentsDirectory stringByAppendingFormat:@"%@%@",@"/",fileName]; 

       NSError* errorr = nil; 
       NSData *fileData = [NSData dataWithContentsOfFile:path options: 0 error: &errorr]; 
       if (fileData == nil) 
       { 
        NSLog(@"Failed to read file, error %@", errorr); 
       } 
       else 
       { 

       } 

Но я всегда получаю эту ошибку:

Failed to read file, error Error Domain=NSCocoaErrorDomain Code=257 "The operation couldn’t be completed. (Cocoa error 257.)" UserInfo=0x156be110 {NSFilePath=/var/mobile/Applications/679253E3-652C-45EE-B589-609E52E4E3B0/Documents/upload/test.xml, NSUnderlyingError=0x156ba7f0 "The operation couldn’t be completed. Permission denied"} 

так что, если я проверить, является ли файл для чтения:

if ([[NSFileManager defaultManager] isReadableFileAtPath: path] == YES) 
        NSLog (@"File is readable"); 
       else 
        NSLog (@"File is read only"); 

я получить результат, что файл является читаемым, так почему я получаю ошибка, если я хочу проанализировать этот файл в NSData ?!

UPDATE: я создал свой файл, например так:

NSString *filePath = [self dataFilePath:fileName]; 

[xmlData writeToFile:filePath atomically:YES]; 

- (NSString *)dataFilePath: (NSString *) path { 

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

NSError *error = nil; 
if (![[NSFileManager defaultManager] fileExistsAtPath:documentsDirectory]) 
    [[NSFileManager defaultManager] createDirectoryAtPath:documentsDirectory withIntermediateDirectories:NO attributes:nil error:&error]; 

NSString *documentsPath = [documentsDirectory 
          stringByAppendingPathComponent:path]; 
return documentsPath; 

} 

UPDATE2: После создания файла, я переместить его в другой каталог с помощью этой функции:

- (void)moveXmlFilesToUploadDirectory 
{ 
@try { 
    //Check if FILES_DIR exists 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                 NSUserDomainMask, YES); 
    NSString *documentsDirectory = [[paths objectAtIndex:0]  stringByAppendingPathComponent:FILES_DIR];//filesDir 
    NSString *uploadDirectory = [[paths objectAtIndex:0] stringByAppendingPathComponent:UPLOAD_DIR];//filesDir 

    if ([[NSFileManager defaultManager] fileExistsAtPath:documentsDirectory]) 
    { 
     NSString *extension = @"xml"; 
     NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsDirectory error:NULL]; 
     NSEnumerator *e = [contents objectEnumerator]; 
     NSString *filename; 
     while ((filename = [e nextObject])) { 

      if ([[filename pathExtension] isEqualToString:extension]) { 
       [[NSFileManager defaultManager] moveItemAtPath:documentsDirectory toPath:[uploadDirectory stringByAppendingPathComponent:filename] error:NULL]; 

      } 
     } 
    } 

} 
@catch (NSException *exception) { 

} 
@finally { 

} 

} 

Может быть, проблема после переезда файл! Причина, если я пытаюсь получить файл в NSData, прежде чем переместить его, все работает ...

+0

Вы можете поделиться своим методом 'documentsDirectory'? –

+0

Это не метод, это путь (NSString)! Я создаю его следующим образом: NSArray * paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); NSString * documentsDirectory = [[paths objectAtIndex: 0] stringByAppendingPathComponent: @ "upload"]; – davidOhara

+0

Используйте 'stringByAppendingPathComponent, а не stringByAppendingFormat. –

ответ

3

Кажется, что вы пытаетесь скопировать весь каталог в пункт назначения, предназначенный для файла. Результатом является то, что путь к файлу - это путь к каталогу в конце, поэтому вы не можете его открыть, как файл, который приводит к сообщению об ошибке разрешения.

Вы должны обновить свой код для копирования

while ((filename = [e nextObject])) { 

      if ([[filename pathExtension] isEqualToString:extension]) { 
       [[NSFileManager defaultManager] moveItemAtPath:[documentsDirectory stringByAppendingPathComponent: filename] toPath:[uploadDirectory stringByAppendingPathComponent:filename] error:NULL]; 

      } 
     } 

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

+0

Спасибо, человек ... Это отлично работает ... – davidOhara

1

Шансы высоки, что у вас нет необходимых прав для этого файла. Проверьте разрешения и добавьте доступ для чтения для текущего пользователя или «всех». Вы можете установить разрешения на чтение для своего пользователя в диалоговом окне информации (cmd + i) или в терминале с chmod u+r test.xml. В конце концов вам необходимо установить владельца до

sudo chown yourusername test.xml 

Надеюсь, что имеет смысл.

+0

Это не работает с приложениями iOS ... – davidOhara

+0

Вы можете использовать NSFileManager для управления разрешениями файлов из вашего приложения. https://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/Reference/Reference.html#//apple_ref/occ/instm/NSFileManager/setAttributes:ofItemAtPath:error: или просто проверить их с помощью (NSDictionary *) attributesOfItemAtPath: (NSString *) ошибка пути: (NSError **) error Было бы интересно узнать, как вы создали этот файл? –

+0

результат: { NSFileCreationDate = "2014-01-23 12:36:06 +0000"; NSFileExtensionHidden = 0; NSFileGroupOwnerAccountID = 501; NSFileGroupOwnerAccountName = мобильный; NSFileModificationDate = "2014-01-23 12:36:06 +0000"; NSFileOwnerAccountID = 501; NSFileOwnerAccountName = мобильный; NSFilePosixPermissions = 493; NSFileProtectionKey = NSFileProtectionCompleteUntilFirstUserAuthentication; NSFileReferenceCount = 2; NSFileSize = 102; NSFileSystemFileNumber = 2777322; NSFileSystemNumber = 16777219; NSFileType = NSFileTypeDirectory; } – davidOhara

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