Pergunta

Eu tenho um aplicativo com In-App Purchase, que quando o usuário comprar algo, baixar um arquivo html em pasta Documentos do meu aplicativo.

Agora preciso verificar se existe este arquivo HTML, por isso, se verdadeira, carregar este arquivo HTML, senão carregar minha página html padrão.

Como posso fazer isso? Com NSFileManager eu não posso chegar fora do mainBundle ..

Foi útil?

Solução

Swift 3:

let documentsURL = try! FileManager().url(for: .documentDirectory,
                                          in: .userDomainMask,
                                          appropriateFor: nil,
                                          create: true)

... dá-lhe uma URL do diretório de documentos de arquivo. A seguir verifica se há um arquivo chamado foo.html:

let fooURL = documentsURL.appendingPathComponent("foo.html")
let fileExists = FileManager().fileExists(atPath: fooURL.path)

Objective-C:

NSString* documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];

NSString* foofile = [documentsPath stringByAppendingPathComponent:@"foo.html"];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:foofile];

Outras dicas

A Apple recomenda contra contando com a fileExistAtPath: método. Muitas vezes é melhor apenas tentar abrir um arquivo e lidar com o erro se o arquivo não existe.

NSFileManager Classe Referência

Nota: A tentativa de comportamento predicado com base no estado atual do sistema de arquivos ou um arquivo específico no sistema de arquivos não é recomendado. Fazer isso pode causar um comportamento ou raça condições ímpares. É muito melhor para tentar uma operação (como carregar um arquivo ou criar um diretório), verificar se há erros, e lidar com esses erros graciosamente do que está a tentar descobrir antes do tempo se a operação terá sucesso. Para mais informações sobre as condições de corrida sistema de arquivos, consulte “condições de corrida e Operações de arquivo seguro” em seguro Guia de Codificação.

Fonte: Apple Developer API Referência

A partir da guia de codificação segura.

Para evitar isso, programas geralmente verifique se um arquivo temporário com um nome específico ainda não existir no diretório de destino. Se tal arquivo a existir, o aplicativo exclui-lo ou escolher um novo nome para o arquivo temporário para o conflito evitar. Se o arquivo não existir, o aplicativo abre o arquivo para a escrita, porque a rotina sistema que abre um arquivo para escrever automaticamente cria um novo arquivo se não existe nenhum. Um atacante, executando continuamente um programa que cria um novo arquivo temporário com o nome apropriado, pode (com um pouco de persistência e alguma sorte) criar o arquivo no espaço entre quando a aplicação marcada para certificar-se não existisse o arquivo temporário e quando ele abre para a escrita. O aplicativo, em seguida, abre o arquivo do atacante e escreve a ele (lembre-se, a rotina de sistema abre um arquivo existente, se houver um, e cria um novo arquivo somente se não houver nenhum arquivo existente). arquivo do atacante pode ter diferentes permissões de acesso do que arquivo temporário do aplicativo, de modo que o atacante pode então ler o conteúdo. Alternativamente, o atacante pode ter o arquivo já está aberto. O atacante poderia substituir o arquivo com um hard link ou link simbólico para algum outro arquivo (ou uma propriedade do atacante ou um arquivo do sistema existente). Por exemplo, o invasor pode substituir o arquivo com um link simbólico para o arquivo de senha do sistema, de modo que após o ataque, as senhas do sistema ter sido danificado ao ponto que ninguém, incluindo o administrador do sistema, pode entrar.

Se você configurar o seu sistema de arquivos diferente ou procurando uma maneira diferente de criar um sistema de arquivos e, em seguida, verificar se existe um arquivo na pasta Documentos heres um outro exemplo. também mostram a verificação dinâmica

for (int i = 0; i < numberHere; ++i){
    NSFileManager* fileMgr = [NSFileManager defaultManager];
    NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    NSString* imageName = [NSString stringWithFormat:@"image-%@.png", i];
    NSString* currentFile = [documentsDirectory stringByAppendingPathComponent:imageName];
    BOOL fileExists = [fileMgr fileExistsAtPath:currentFile];
    if (fileExists == NO){
        cout << "DOESNT Exist!" << endl;
    } else {
        cout << "DOES Exist!" << endl;
    }
}

Swift 2.0

Esta é a forma de verificar se o arquivo existe usando Swift

func isFileExistsInDirectory() -> Bool {
    let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
    let documentsDirectory: AnyObject = paths[0]
    let dataPath = documentsDirectory.stringByAppendingPathComponent("/YourFileName")

    return NSFileManager.defaultManager().fileExistsAtPath(dataPath)
}

Verificar se existem arquivos no lado do caminho do documento / catchimage:

NSString *stringPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
NSString *tempName = [NSString stringWithFormat:@"%@/catchimage/%@.png",stringPath,@"file name"];
NSLog(@"%@",temName);
if([[NSFileManager defaultManager] fileExistsAtPath:temName]){
    // ur code here
} else {
    // ur code here** 
}
NSArray *directoryPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *imagePath =  [directoryPath objectAtIndex:0];
//If you have superate folder
imagePath= [imagePath stringByAppendingPathComponent:@"ImagesFolder"];//Get docs dir path with folder name
_imageName = [_imageName stringByAppendingString:@".jpg"];//Assign image name
imagePath= [imagePath stringByAppendingPathComponent:_imageName];
NSLog(@"%@", imagePath);

//Method 1:
BOOL file = [[NSFileManager defaultManager] fileExistsAtPath: imagePath];
if (file == NO){
    NSLog("File not exist");
} else {
    NSLog("File exist");
}

//Method 2:
NSData *data = [NSData dataWithContentsOfFile:imagePath];
UIImage *image = [UIImage imageWithData:data];
if (!(image == nil)) {//Check image exist or not
    cell.photoImageView.image = image;//Display image
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top