NSFileManager не может получить файлы

#iphone #objective-c #ios #ipad

#iPhone #objective-c #iOS #iPad

Вопрос:

В методе transmitData количество файлов NSArray равно нулю. В чем проблема в моем коде? Я сохраняю файл (мы нажимаем [file writeToURL: fileURL атомарно: ДА]), а затем мы вызываем transmitData, но не можем получить файлы.

 #import "FileManagerService.h"
#import "SynthesizeSingleton.h"
@implementation FileManagerService
SYNTHESIZE_SINGLETON_FOR_CLASS(FileManagerService);

#define SAVEVOTER @"SV"
#define SAVESCRIPT @"SS"

- (NSURL *)applicationDocumentsDirectory 
{
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory   inDomains:NSUserDomainMask] lastObject];
}

-(void)saveFile:(NSData*)file:(NSString*)dataType
{
NSFileManager *manager = [NSFileManager defaultManager];
NSURL *fileURL;
NSString *fileName;

if (dataType == DATA_SAVE_VOTER)
{
    fileName = [NSString stringWithFormat:@"%@01",SAVEVOTER];
    fileURL = [[self applicationDocumentsDirectory]URLByAppendingPathComponent:fileName];

    int fID = 0;

    while ([manager fileExistsAtPath:[fileURL absoluteString]]) 
    {
        fID  ;

        fileName = [NSString stringWithFormat:@"%@%d",SAVEVOTER,fID];
        fileURL = [[self applicationDocumentsDirectory]URLByAppendingPathComponent:fileName];
    }

}
else if (dataType == DATA_SAVE_SCRIPT)
{
    fileName = [NSString stringWithFormat:@"%@01",SAVESCRIPT];
    fileURL = [[self applicationDocumentsDirectory]URLByAppendingPathComponent:fileName];

    int fID = 0;

    while ([manager fileExistsAtPath:[fileURL absoluteString]]) 
    {
        fID  ;

        fileName = [NSString stringWithFormat:@"%@%d",SAVESCRIPT,fID];
        fileURL = [[self applicationDocumentsDirectory]URLByAppendingPathComponent:fileName];
    }

}


[file writeToURL:fileURL atomically:YES];
}


-(void)transmitData
{
NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[[self applicationDocumentsDirectory]absoluteString] error:NULL];

if (files == nil || [files count] <= 0)
{
    NSLog(@"No files to transmit");
    return;
}

for (id file in files) 
{ 
    NSData * dt = file;
    NSString *str = [[NSString alloc]initWithData:dt encoding:NSUTF8StringEncoding];

    NSLog(@"DataContents: %@",str);
}
}

@end
  

Редактировать:
После дополнительного тестирования :

 fileName = @"testfile";
    fileURL = [[self    applicationDocumentsDirectory]URLByAppendingPathComponent:fileName];

        NSLog(@"URL1: %@",[fileURL absoluteString]);
  

В моем журнале отображается значение Null. Поэтому я не могу извлекать файлы, потому что я, очевидно, сохраняю с нулевым расположением файла….почему это происходит?

ИСПРАВЛЕНО:

Поэтому я понятия не имею, почему, но [file writeToURL:fileURL атомарно: ДА] НЕ работает, а [[NSFileManager defaultManager] createFileAtPath:fileURL contents:атрибуты файла: nil]; работает.

Ответ №1:

Использовать

 - (NSURL *)applicationDocumentsDirectory
{
    NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentPath = [searchPaths objectAtIndex:0];

    return [NSURL fileURLWithPath:documentPath];
}
  

и

 NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[[self applicationDocumentsDirectory]path] error:NULL];
  

Комментарии:

1. Мой плохой, не используйте absoluteString. Отредактировал мой ответ.

2. Похоже, я получаю действительный URL-адрес, если я тестирую на устройстве, а не на SIM-карте … но он по-прежнему не может получить файлы

3. Вы уверены, что в симуляторе есть файлы по этому пути?

4. URL: /var/mobile/Applications/2B2BA596-38BF-4D74-881C-72F2B175ACC8/Documents/SV01 Я получаю этот URL только в том случае, если сохраняю на устройстве, а не на SIM-карте. Но мой код по-прежнему не читает файлы. Я ожидаю, что массив files будет принимать каждый файл и помещать его в качестве элемента массива в качестве NSData. Это неправильно?

5. contentsOf … не возвращает файловые объекты. Он возвращает имена файлов и папок внутри каталога.