获取从目录文件到NSData的

问题描述:

我试图让我的文件在文件目录我自己创建的目录到一个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?

更新:我创建了我的文件是这样的:

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 = [[路径objectAtIndex:0] stringByAppendingPathComponent:@“upload”]; – davidOhara

+0

使用'stringByAppendingPathComponent,而不是stringByAppendingFormat。 –

看来你试图将整个目录复制到目标文件中。结果是文件路径最终是一个目录路径,所以你不能像打开权限错误信息的文件那样打开它。

您应该更新您的副本代码

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

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

      } 
     } 

到每一个文件单独复制。这将创建一个目录的目标路径目标的实际文件。

+0

谢谢你......这很好... – davidOhara

您没有该文件的正确权限的可能性很高。请检查权限并为当前用户或“所有人”添加读取权限。您可以通过信息对话框(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:or just检查它们 - (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