Bagaimana cara memeriksa apakah ada file di folder Dokumen?

216

Saya memiliki aplikasi dengan Pembelian Dalam Aplikasi, bahwa ketika pengguna membeli sesuatu, unduh satu file html ke folder Dokumen aplikasi saya.

Sekarang saya harus memeriksa apakah file HTML ini ada, jadi jika benar, muat file HTML ini, atau muat halaman html default saya.

Bagaimana saya bisa melakukan itu? Dengan NSFileManagersaya tidak bisa keluar dari mainBundle..

Obliviux
sumber
"Dengan NSFileManager saya tidak bisa keluar dari mainBundle" - dari mana Anda mendapatkan informasi yang salah ini?

Jawaban:

521

Swift 3:

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

... memberi Anda URL file dari direktori dokumen. Berikut ini memeriksa apakah ada file bernama foo.html:

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

Tujuan-C:

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

NSString* foofile = [documentsPath stringByAppendingPathComponent:@"foo.html"];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:foofile];
Nikolai Ruhe
sumber
12
Perhatikan bahwa Anda memuat file dari direktori Dokumen pribadi aplikasi Anda, bukan yang global yang Anda temukan jika Anda di-jailbreak. Jika Anda menginstal aplikasi di / Aplikasi seolah-olah itu adalah aplikasi utama Anda akan memiliki akses ke seluruh sistem file dan Anda akan menggunakan direktori Dokumen bersama. Jika Anda menginstalnya melalui iTunes atau XCode Anda akan menggunakan direktori pribadi aplikasi Anda. Sangat menyenangkan untuk menyimpan file di direktori lokal Anda untuk tujuan cadangan.
Epsilon Prime
6
objectAtIndex: 0 sekarang dapat diganti dengan firstObject
Govind
3
Atau hanya [0]melalui pengaksesan indeks
temporary_user_name
firstObject lebih aman daripada [0] dan objectAtIndex: 0
Itachi
1
@ Itachi Sebenarnya dalam hal ini saya lebih suka pengecualian ketika tidak ada objek dalam array. Jika hasilnya firstObjectadalah niltidak ada cara yang masuk akal bagaimana program dapat berlanjut, karena sesuatu dalam kerangka Apple rusak parah.
Nikolai Ruhe
14

Apple merekomendasikan untuk tidak mengandalkan metode fileExistAtPath :. Sering kali lebih baik hanya mencoba membuka file dan mengatasi kesalahan jika file tersebut tidak ada.

Referensi Kelas NSFileManager

Catatan: Mencoba untuk memprediksikan perilaku berdasarkan pada kondisi saat ini dari sistem file atau file tertentu pada sistem file tidak dianjurkan. Hal itu dapat menyebabkan perilaku aneh atau kondisi ras. Jauh lebih baik untuk mencoba operasi (seperti memuat file atau membuat direktori), memeriksa kesalahan, dan menangani kesalahan itu dengan anggun daripada mencoba mencari tahu sebelumnya apakah operasi akan berhasil. Untuk informasi lebih lanjut tentang kondisi perlombaan sistem file, lihat “Ketentuan Ras dan Operasi File Aman” di Panduan Pengodean Aman.

Sumber: Referensi API Pengembang Apple

Dari panduan pengodean aman.

Untuk mencegah hal ini, program sering memeriksa untuk memastikan file sementara dengan nama tertentu belum ada di direktori target. Jika ada file seperti itu, aplikasi akan menghapusnya atau memilih nama baru untuk file sementara untuk menghindari konflik. Jika file tidak ada, aplikasi membuka file untuk ditulis, karena sistem rutin yang membuka file untuk menulis secara otomatis membuat file baru jika tidak ada. Seorang penyerang, dengan terus menjalankan program yang membuat file sementara baru dengan nama yang sesuai, dapat (dengan sedikit kegigihan dan sedikit keberuntungan) membuat file di celah antara saat aplikasi memeriksa untuk memastikan file sementara tidak ada dan ketika dibuka untuk menulis. Aplikasi kemudian membuka file penyerang dan menulis ke sana (ingat, sistem rutin membuka file yang ada jika ada, dan membuat file baru hanya jika tidak ada file yang ada). File penyerang mungkin memiliki izin akses yang berbeda dari file sementara aplikasi, sehingga penyerang dapat membaca isinya. Atau, penyerang mungkin sudah membuka file. Penyerang dapat mengganti file dengan tautan keras atau tautan simbolis ke beberapa file lain (baik milik penyerang atau file sistem yang ada). Misalnya, penyerang dapat mengganti file dengan tautan simbolis ke file kata sandi sistem, sehingga setelah serangan, kata sandi sistem telah rusak hingga tidak ada seorang pun, termasuk administrator sistem, yang dapat login. Atau, penyerang mungkin sudah membuka file. Penyerang dapat mengganti file dengan tautan keras atau tautan simbolis ke beberapa file lain (baik milik penyerang atau file sistem yang ada). Misalnya, penyerang dapat mengganti file dengan tautan simbolis ke file kata sandi sistem, sehingga setelah serangan, kata sandi sistem telah rusak hingga tidak ada seorang pun, termasuk administrator sistem, yang dapat login. Atau, penyerang mungkin sudah membuka file. Penyerang dapat mengganti file dengan tautan keras atau tautan simbolis ke beberapa file lain (baik milik penyerang atau file sistem yang ada). Misalnya, penyerang dapat mengganti file dengan tautan simbolis ke file kata sandi sistem, sehingga setelah serangan, kata sandi sistem telah rusak hingga tidak ada seorang pun, termasuk administrator sistem, yang dapat login.

orkoden
sumber
1
Meskipun ini adalah jawaban yang bagus, itu sendiri memberikan saran yang bagus. Akan baik untuk melihat bagaimana ini dapat diimplementasikan dengan contoh kode kecil.
SnareChops
8

Jika Anda mengatur sistem file Anda secara berbeda atau mencari cara lain untuk mengatur sistem file dan kemudian memeriksa apakah file ada di folder dokumen ada contoh lain. juga menunjukkan pemeriksaan dinamis

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

Swift 2.0

Ini adalah cara memeriksa apakah file ada menggunakan 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)
}
Tal Zion
sumber
3

periksa apakah file ada di samping jalur dokumen / tangkapan gambar:

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

NSURL.h disediakan - (BOOL)checkResourceIsReachableAndReturnError:(NSError **)erroruntuk melakukannya

NSURL *fileURL = [NSURL fileURLWithPath:NSHomeDirectory()];
NSError * __autoreleasing error = nil;
if ([fileURL checkResourceIsReachableAndReturnError:&error]) {
    NSLog(@"%@ exists", fileURL);
} else {
    NSLog(@"%@ existence checking error: %@", fileURL, error);
}

Atau menggunakan Swift

if let url = URL(fileURLWithPath: NSHomeDirectory()) {
    do {
        let result = try url.checkResourceIsReachable()
    } catch {
        print(error)
    }
}
DawnSong
sumber