2014-01-22 1 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 : @ "업로드"]; – 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 Apps에서는 작동하지 않습니다 ... – 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:or 그들을 확인하십시오 - (NSDictionary *) attributesOfItemAtPath : (NSString *) 경로 오류 : (NSError **) 오류 그것은 당신이 그 파일을 어떻게 생성했는지 아는 것이 재미 있을까요? –

+0

결과 : { NSFileCreationDate = "2014-01-23 12:36:06 +0000"; NSFileExtensionHidden = 0; NSFileGroupOwnerAccountID = 501; NSFileGroupOwnerAccountName = mobile; NSFileModificationDate = "2014-01-23 12:36:06 +0000"; NSFileOwnerAccountID = 501; NSFileOwnerAccountName = mobile; NSFilePosixPermissions = 493; NSFileProtectionKey = NSFileProtectionCompleteUntilFirstUserAuthentication; NSFileReferenceCount = 2; NSFileSize = 102; NSFileSystemFileNumber = 2777322; NSFileSystemNumber = 16777219; NSFileType = NSFileTypeDirectory; } – davidOhara