Вземете файл от директория в 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;

}

АКТУАЛИЗАЦИЯ2: След като създам файла, го премествам в друга директория с тази функция:

- (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, преди да го преместя, всичко работи...


person davidOhara    schedule 22.01.2014    source източник
comment
Можете ли да споделите своя documentsDirectory метод?   -  person James Frost    schedule 22.01.2014
comment
Това не е метод, това е път (NSString)! Създавам го така: NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [[paths objectAtIndex:0] stringByAppendingPathComponent:@upload];   -  person davidOhara    schedule 22.01.2014
comment
Използвайте `stringByAppendingPathComponent, а не stringByAppendingFormat.   -  person Hot Licks    schedule 22.01.2014
comment
Същата грешка, ако използвам: NSString *path = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@%@/, fileName]];   -  person davidOhara    schedule 23.01.2014
comment
Но все пак трябва да използвате stringByAppendingPathComponent. Можете да получите малко, като използвате другата схема и тя изисква повече знаци за въвеждане и също е по-малко ефективна.   -  person Hot Licks    schedule 23.01.2014


Отговори (2)


Изглежда, че се опитвате да копирате цялата директория до дестинация, предназначена да бъде файл. Резултатът е, че пътят към файла в крайна сметка е път към директория, така че не можете да го отворите като файл, което води до съобщение за грешка при разрешение.

Трябва да актуализирате своя код за копиране на

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

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

            }
        }

за да копирате всеки файл поотделно. Това ще създаде действителния файл в целевия път на директория.

person Alexander Ney    schedule 23.01.2014

Шансовете са големи да нямате правилните разрешения за този файл. Моля, проверете разрешенията и добавете достъп за четене за текущия потребител или „всички“. Можете да зададете разрешенията за четене за вашия потребител от информационния диалог (cmd + i) или в терминала с chmod u+r test.xml. В крайна сметка трябва да зададете собственика преди с

sudo chown yourusername test.xml 

Надявам се, че има смисъл.

person Alexander Ney    schedule 22.01.2014
comment
Можете да използвате NSFileManager, за да манипулирате разрешенията за файлове от вашето приложение. developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Reference/ просто ги проверете с - (NSDictionary *)attributesOfItemAtPath:(NSString *)path грешка: (NSError **)error Би било интересно да разберете как сте създали този файл? - person Alexander Ney; 23.01.2014
comment
резултат: {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; } - person davidOhara; 23.01.2014
comment
директорията изглежда добре. Какво ще кажете за вашия test.xml? - person Alexander Ney; 23.01.2014
comment
какви са атрибутите на вашия файл, до които се опитвате да получите достъп? И откъде идва? Създавате ли го в приложението? - person Alexander Ney; 23.01.2014
comment
Току-що публикувах атрибутите на моя файл! И актуализирах моя въпрос, където можете да видите как създадох този файл! Да, създадено е в приложението! - person davidOhara; 23.01.2014
comment
нека да продължим тази дискусия в чата - person davidOhara; 23.01.2014
comment
Съжалявам, видях файловите атрибути за директория developer.apple.com/library/mac/documentation/cocoa/reference/, както можете да го видите на NSFileType = NSFileTypeDirectory; Мислех, че това е вашата директория за качване. Извикването на метода [xmlData writeToFile:filePath atomically:YES]; е непрозрачен, така че не мога да видя какво се случва там. Но тогава атрибутите на файла са грешни, защото те очевидно са на директория вместо на файл, може би това е проблемът - person Alexander Ney; 23.01.2014
comment
Можеш ли да влезеш в чата?! - person davidOhara; 23.01.2014