Saya mencari cara yang lebih baik untuk mendeteksi ruang disk yang tersedia / kosong di perangkat iPhone / iPad secara terprogram.
Saat ini saya menggunakan NSFileManager untuk mendeteksi ruang disk. Berikut ini cuplikan kode yang berfungsi untuk saya:
-(unsigned)getFreeDiskspacePrivate {
NSDictionary *atDict = [[NSFileManager defaultManager] attributesOfFileSystemForPath:@"/" error:NULL];
unsigned freeSpace = [[atDict objectForKey:NSFileSystemFreeSize] unsignedIntValue];
NSLog(@"%s - Free Diskspace: %u bytes - %u MiB", __PRETTY_FUNCTION__, freeSpace, (freeSpace/1024)/1024);
return freeSpace;
}
Apakah saya benar dengan cuplikan di atas? atau apakah ada cara yang lebih baik untuk mengetahui total ruang disk yang tersedia / bebas.
Saya sudah mendeteksi total ruang disk kosong, karena kami harus mencegah aplikasi kami melakukan sinkronisasi dalam skenario ruang disk rendah.
Jawaban:
UPDATE : Karena banyak waktu telah berlalu setelah jawaban ini dan metode / API baru telah ditambahkan, silakan periksa jawaban yang diperbarui di bawah untuk Swift dll; Karena saya sendiri belum menggunakannya, saya tidak bisa menjaminnya.
Jawaban asli : Saya menemukan solusi berikut ini berfungsi untuk saya:
Ini mengembalikan saya persis ukuran yang ditampilkan iTunes ketika perangkat terhubung ke mesin.
sumber
NSUInteger
bukan hal-hal sepertiuint64_t
? Kami sedang menulis Obj-C, bukan C ++ atau C. NSUInteger akan memberi Anda integer 64 bit yang tidak ditandatangani sekarang, tetapi jika terjadi perubahan, saya membayangkan Apple akan memperbarui Makro itu (katakanlah 128 bit pada suatu titik, menjadi nyata)Sumber yang direvisi menggunakan unsigned, lama:
EDIT: tampaknya seseorang mengedit kode ini untuk menggunakan 'uint64_t' alih-alih 'unsigned long long'. Sementara di masa mendatang ini seharusnya baik-baik saja, mereka tidak sama. 'uint64_t' adalah 64 bit dan akan selalu seperti itu. Dalam 10 tahun 'unsigned long long' mungkin 128. ini adalah poin kecil tapi mengapa saya menggunakan unsignedLongLong.
sumber
Saya telah menulis sebuah kelas untuk mendapatkan memori yang digunakan / digunakan menggunakan Swift. Demo di: https://github.com/thanhcuong1990/swift-disk-status
Swift 4 diperbarui.
Demo
sumber
Jika Anda membutuhkan string yang diformat dengan ukuran Anda dapat melihat perpustakaan yang bagus di GitHub :
sumber
Jangan gunakan 'unsigned', hanya 32 bit yang akan melebihi 4GB, yang kurang dari ruang bebas khas iPad / iPhone. Gunakan unsigned long long (atau uint64_t), dan ambil nilai dari NSNumber sebagai 64-bit int juga menggunakan unsignedLongLongValue.
sumber
Jika Anda mencari untuk mendapatkan ruang kosong yang tersisa menggunakan Swift itu sedikit berbeda. Anda perlu menggunakan atributOfFileSystemForPath () alih-alih atributOfItemAtPath ():
Edit: Diperbarui untuk Swift 1.0
Edit 2: Diperbarui untuk keselamatan, menggunakan jawaban Martin R .
Sunting 3: Diperbarui untuk Swift 2.0 (oleh dgellow )
sumber
Inilah jawaban saya dan mengapa lebih baik.
Jawab (Cepat):
Jawab (Objective-C):
Mengapa lebih baik:
NSByteCountFormatter
, yang berarti tidak ada perhitungan manual yang gila dari byte ke gigabytes. Apple melakukan ini untuk Anda!NSByteCountFormatter
apakah ini untuk Anda. Misalnya. Ketika bahasa perangkat diatur ke Bahasa Inggris, string akan membaca 248,8 MB tetapi akan membaca 248,8 Mo ketika diatur ke Prancis, dan lain-lain untuk bahasa lain.sumber
Klarifikasi penting (setidaknya untuk saya). Jika saya menghubungkan iPod saya ke Mac saya, ini adalah info yang diperlihatkan oleh iTunes App.
Ketika saya menggunakan kode di atas:
CountStyle NSByteCountFormatterCountStyleFile menunjukkan kepada saya: 17,41 GB
CountStyle NSByteCountFormatterCountStyleBinary menunjukkan kepada saya: 16,22 GB
16,22 GB ( NSByteCountFormatterCountStyleBinary ) Ini adalah persis jumlah yang ditunjukkan App iTunes kepada saya ketika saya menghubungkan iPod saya ke Mac saya.
sumber
Perbarui dengan API akurat baru untuk mendapatkan ukuran yang tersedia pada disk yang tersedia di iOS11. Berikut adalah deskripsi untuk kunci sumber daya API baru:
Saya silang membandingkan hasil dari kunci " FileAttributeKey.systemFreeSize " dan kunci " URLResourceKey.volumeAvailableCapacityForImportantUsageKey " dan menemukan hasil yang dikembalikan dari " volumeAvailableCapacityForImportantUsageKey " persis sama dengan penyimpanan yang tersedia yang ditampilkan di UI. Berikut ini adalah implementasi cepat:
sumber
volumeAvailableCapacityForOpportunisticUsageKey
,.NSHomeDirectory()
atauNSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
. Apakah ada perbedaan menggunakan keduanya?Anda dapat menemukan solusi lain dengan menggunakan Swift 4 dan
extension
yang memberi Anda opsi yang baik.Ini
UIDevice
ekstensi.Dan penggunaan sampel:
sumber
!
bukan menempatkanguard
amantypecasting
ataunil
periksa.Untuk iOS> = 6.0 Anda dapat menggunakan yang baru
NSByteCountFormatter
. Kode ini mendapatkan jumlah byte gratis yang tersisa sebagai string yang diformat.sumber
Kode berikut adalah implementasi versi Swift 3.0 dari jawaban yang sebelumnya disediakan oleh ChrisJF:
sumber
untuk Swift sebagai ekstensi UIDevice
Cara Penggunaan:
Output akan menjadi:
sumber
Saya tahu posting ini agak lama, tetapi saya pikir jawaban ini dapat membantu seseorang. Jika Anda ingin mengetahui ruang disk yang digunakan / bebas / total pada perangkat Anda dapat menggunakan Luminous . Itu ditulis dalam bahasa Swift. Anda hanya perlu menelepon:
atau
sumber
Implementasi cepat kode di atas: -
Sebut saja dari kelas lain.
Saat menguji nilai yang dikembalikan, itu sama seperti yang ditunjukkan oleh aplikasi lain. Setidaknya di iPhone 6S + saya. Hanya saja implementasi cepat dari jawaban yang ditunjukkan di atas. Dan bagi saya jawaban yang diterima tidak berhasil.
sumber
ChrisJF menjawab dalam versi Swift 2.1 :
sumber
Jika Anda ingin menghemat waktu, gunakan Perpustakaan CocoaPod berikut. Saya tidak menggunakannya tetapi sepertinya itu akan berhasil.
https://cocoapods.org/pods/SystemServices
sumber
Ekstensi Swift 5 untuk
FileManager
penanganan error yang tepat dan tanpa konversi string otomatis (konversi jumlah byte ke string sesuai keinginan Anda). Juga mengikutiFileManager
penamaan.Contoh penggunaan:
sumber