it-swarm.com.de

Wie prüfe ich, ob eine Datei im Ordner Dokumente vorhanden ist?

Ich habe eine Anwendung mit In-App Purchase, bei der der Benutzer eine HTML-Datei in den Ordner "Dokumente" meiner App lädt.

Jetzt muss ich überprüfen, ob diese HTML-Datei vorhanden ist. Wenn dies zutrifft, lade diese HTML-Datei.

Wie kann ich das machen? Mit NSFileManager komme ich nicht aus mainBundle heraus.

206
Obliviux

Swift 3:

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

... gibt Ihnen eine Datei-URL des Dokumentenverzeichnisses. Folgendes überprüft, ob es eine Datei mit dem Namen foo.html gibt:

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

Ziel c:

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

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

Apple empfiehlt, sich nicht auf die fileExistAtPath: -Methode zu verlassen. Es ist oft besser, einfach eine Datei zu öffnen und den Fehler zu beheben, wenn die Datei nicht vorhanden ist.

NSFileManager-Klassenreferenz

Hinweis: Es wird nicht empfohlen, ein Verhalten basierend auf dem aktuellen Status des Dateisystems oder einer bestimmten Datei im Dateisystem vorherzusagen. Andernfalls kann es zu ungewöhnlichem Verhalten oder zu Rennbedingungen kommen. Es ist weitaus besser, eine Operation (z. B. Laden einer Datei oder Erstellen eines Verzeichnisses) zu versuchen, auf Fehler zu prüfen und diese Fehler ordnungsgemäß zu behandeln, als zu versuchen, im Voraus zu ermitteln, ob die Operation erfolgreich ist. Weitere Informationen zu Dateisystemrennen finden Sie unter "Bedingungen für Rennen und sichere Datei" im Secure Coding Guide.

Quelle: Apple Developer API-Referenz

Aus der sicheren Kodierungsanleitung.

Um dies zu verhindern, überprüfen Programme häufig, ob eine temporäre Datei mit einem bestimmten Namen noch nicht im Zielverzeichnis vorhanden ist. Wenn eine solche Datei vorhanden ist, löscht die Anwendung sie oder wählt einen neuen Namen für die temporäre Datei, um Konflikte zu vermeiden. Wenn die Datei nicht vorhanden ist, öffnet die Anwendung die Datei zum Schreiben, da die Systemroutine, die eine Datei zum Schreiben öffnet, automatisch eine neue Datei erstellt, falls keine vorhanden ist . Ein Angreifer kann durch kontinuierliches Ausführen eines Programms, das eine neue temporäre Datei mit dem entsprechenden Namen erstellt, die Datei (mit etwas Beharrlichkeit und etwas Glück) in der Lücke zwischen der Prüfung der Anwendung erstellen, um sicherzustellen, dass die temporäre Datei nicht vorhanden ist und wenn es zum Schreiben geöffnet wird. Die Anwendung öffnet dann die Datei des Angreifers und schreibt sie hinein (Denken Sie daran, dass die Systemroutine eine vorhandene Datei öffnet, falls vorhanden, und nur dann eine neue Datei erstellt, wenn keine Datei vorhanden ist) . Die Datei des Angreifers verfügt möglicherweise über andere Zugriffsberechtigungen als die temporäre Datei der Anwendung, sodass der Angreifer den Inhalt lesen kann. Alternativ kann der Angreifer die Datei bereits geöffnet haben. Der Angreifer kann die Datei durch einen festen Link oder einen symbolischen Link zu einer anderen Datei ersetzen (entweder eine Datei, die dem Angreifer gehört, oder eine vorhandene Systemdatei). Beispielsweise könnte der Angreifer die Datei durch einen symbolischen Link zur Systemkennwortdatei ersetzen, so dass die Systemkennwörter nach dem Angriff so beschädigt wurden, dass sich niemand, einschließlich des Systemadministrators, anmelden kann.

13
orkoden

Wenn Sie Ihr Dateisystem anders einrichten oder nach einer anderen Möglichkeit suchen, ein Dateisystem einzurichten und dann zu prüfen, ob eine Datei im Dokumentenordner vorhanden ist, ist dies ein anderes Beispiel. zeigen auch dynamische Überprüfung

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;
    }
}
8
John Riselvato

Swift 2.0

So prüfen Sie, ob die Datei mit Swift existiert

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)
}
4
Tal Zion

prüfen Sie, ob die Datei im Dokument-/Catchimage-Pfad vorhanden ist:

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** 
}
3
Mani Vannan
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
}
0
iOS