Frage

Ich habe eine Anwendung mit In-App-Kauf, dass, wenn der Benutzer etwas kaufen, laden Sie eine HTML-Datei in den Ordner Dokumente meiner App.

Jetzt muß ich überprüfen, ob diese HTML-Datei vorhanden ist, also, wenn wahr, diese HTML-Datei laden, sonst meine Standard-HTML-Seite geladen werden.

Wie kann ich das tun? Mit NSFileManager kann ich nicht außerhalb von mainBundle bekommen ..

War es hilfreich?

Lösung

Swift 3:

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

... gibt Ihnen eine Datei-URL des Dokumentenverzeichnis. Die folgend überprüft, ob es eine Datei mit dem Namen 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];

Andere Tipps

Apple empfiehlt auf der fileExistAtPath gegen Berufung: Methode. Oft ist es besser, nur versuchen, eine Datei zu öffnen und mit dem Fehler umgehen, wenn die Datei nicht existiert.

  

NSFileManager Klassenreferenz

     

Hinweis: Der Versuch, das Verhalten auf den aktuellen Zustand des Dateisystems oder einer bestimmten Datei auf dem Dateisystem Prädikat wird nicht empfohlen. Dadurch kann merkwürdige Verhalten oder Rennbedingungen verursachen. Es ist viel besser, eine Operation zu versuchen (wie zB Laden eine Datei oder ein Verzeichnis erstellen), auf Fehler prüfen, und diese Fehler ordnungsgemäß handhaben, als es zu versuchen, vor der Zeit, um herauszufinden, ob die Operation erfolgreich sein wird. Weitere Informationen über das Dateisystem Rennbedingungen finden Sie unter „Rennbedingungen und sichere Dateioperationen“ Secure Coding Guide.

Quelle: Apple Developer-API-Referenz

Von der sicheren Codierung Führung.

  

Um dies zu verhindern, überprüfen Programme oft sicher eine temporäre Datei mit einem bestimmten Namen im Zielverzeichnis existiert nicht bereits zu machen. Wenn eine solche Datei vorhanden ist, löscht es die Anwendung oder wählt einen neuen Namen für die temporäre Datei Konflikte zu vermeiden. Wenn die Datei nicht existiert, öffnet die Anwendung die Datei zum Schreiben, weil die Systemroutine, die automatisch eine Datei öffnet zum Schreiben eine neue Datei erstellt, wenn keiner vorhanden ist.   Ein Angreifer, indem kontinuierlich ein Programm ausgeführt wird, der eine neue temporäre Datei mit dem entsprechenden Namen erstellt, kann (mit einer wenig Ausdauer und etwas Glück), um die Datei in dem Spalte zwischen erstellen, wenn die Anwendung sicher, dass die temporäre Datei nicht machen geprüft existieren und wenn sie sich öffnet es für das Schreiben. Die Anwendung öffnet dann die Datei des Angreifers und schreibt sie (denken Sie daran, die Systemroutine eine vorhandene Datei öffnet, wenn es einen gibt, und erstellt eine neue Datei nur, wenn es keine vorhandene Datei).   Die Datei des Angreifers möglicherweise unterschiedliche Zugriffsberechtigungen als die temporäre Datei der Anwendung, so dass der Angreifer dann den Inhalt lesen kann. Alternativ könnte der Angreifer die Datei bereits geöffnet. Der Angreifer kann die Datei mit einem harten Link oder einen symbolischen Link zu einer anderen Datei (entweder im Besitz des Angreifers oder eine bestehende Systemdatei) ersetzen. Zum Beispiel könnte der Angreifer die Datei mit einem symbolischen Link auf das System-Passwort-Datei ersetzen, so dass nach dem Angriff haben die System-Passwörter zu dem Punkt beschädigt worden, dass niemand, einschließlich der Systemadministrator kann sich anmelden.

Wenn Sie Ihr Dateisystem anders einrichten oder auf der Suche nach einer anderen Art und Weise der Einstellung eines Dateisystems und dann überprüft, ob eine Datei in den Dokumenten existiert Ordner heres ein weiteres Beispiel. auch zeigen dynamische Kontrolle

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

Dies ist, wie Sie überprüfen, ob die Datei existiert Swift mit

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)
}

überprüfen, ob die Datei in Seite existiert, um das Dokument / Catch Pfad:

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
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top