获取从目录文件到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中,一切正常......
看来你试图将整个目录复制到目标文件中。结果是文件路径最终是一个目录路径,所以你不能像打开权限错误信息的文件那样打开它。
您应该更新您的副本代码
while ((filename = [e nextObject])) {
if ([[filename pathExtension] isEqualToString:extension]) {
[[NSFileManager defaultManager] moveItemAtPath:[documentsDirectory stringByAppendingPathComponent: filename] toPath:[uploadDirectory stringByAppendingPathComponent:filename] error:NULL];
}
}
到每一个文件单独复制。这将创建一个目录的目标路径目标的实际文件。
谢谢你......这很好... – davidOhara
您没有该文件的正确权限的可能性很高。请检查权限并为当前用户或“所有人”添加读取权限。您可以通过信息对话框(cmd + i)或在终端中为chmod u+r test.xml
设置用户的读取权限。最终,你必须与
sudo chown yourusername test.xml
希望是有道理之前设置的所有者。
这不适用于iOS应用程序... – davidOhara
您可以使用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 **)错误知道如何创建该文件会很有趣? –
结果: { 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
你可以分享你的'documentsDirectory'方法吗? –
这不是一种方法,它是一种路径(NSString)!我创建它是这样的:NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); NSString * documentsDirectory = [[路径objectAtIndex:0] stringByAppendingPathComponent:@“upload”]; – davidOhara
使用'stringByAppendingPathComponent,而不是stringByAppendingFormat。 –