Szukam lepszego sposobu na programowe wykrywanie dostępnego / wolnego miejsca na dysku na urządzeniu iPhone / iPad.
Obecnie używam NSFileManager do wykrywania miejsca na dysku. Poniżej znajduje się fragment kodu, który działa za mnie:
-(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;
}
Czy mam rację z powyższym fragmentem? czy jest lepszy sposób na sprawdzenie całkowitej dostępnej / wolnej przestrzeni dyskowej.
Muszę wykryć całkowitą ilość wolnego miejsca na dysku, ponieważ musimy uniemożliwić naszej aplikacji wykonanie synchronizacji w scenariuszu z małą ilością miejsca na dysku.
Odpowiedzi:
AKTUALIZACJA : Ponieważ od tej odpowiedzi upłynęło dużo czasu i dodano nowe metody / interfejsy API, sprawdź zaktualizowane odpowiedzi poniżej dla Swift itp; Ponieważ sam ich nie używałem, nie mogę za nie ręczyć.
Oryginalna odpowiedź : znalazłem następujące rozwiązanie, które działa dla mnie:
Zwraca mi dokładnie taki rozmiar, jaki wyświetla iTunes, gdy urządzenie jest podłączone do komputera.
źródło
NSUInteger
zamiast takich rzeczyuint64_t
? Piszemy Obj-C, a nie C ++ lub C.NSUInteger poda teraz 64-bitową liczbę całkowitą bez znaku, ale jeśli coś się zmieni, wyobrażam sobie, że Apple zaktualizuje to makro (powiedzmy, że 128 bitów w pewnym momencie stanie się rzeczywiste)Zmienione źródło używające unsigned long long:
EDYCJA: wygląda na to, że ktoś zmodyfikował ten kod, aby użyć „uint64_t” zamiast „unsigned long long”. Chociaż w dającej się przewidzieć przyszłości powinno to być w porządku, nie są takie same. „uint64_t” ma 64 bity i zawsze nim będzie. Za 10 lat „unsigned long long” może wynosić 128. to mały punkt, ale dlaczego użyłem unsignedLongLong.
źródło
Napisałem klasę, aby uzyskać dostępną / używaną pamięć za pomocą Swift. Demo na: https://github.com/thanhcuong1990/swift-disk-status
Swift 4 zaktualizowany.
Próbny
źródło
Jeśli potrzebujesz sformatowanego ciągu z rozmiarem, możesz rzucić okiem na ładną bibliotekę na GitHub :
źródło
Nie używaj `` bez znaku '', tylko 32 bity przekroczą 4 GB, czyli mniej niż typowe wolne miejsce na iPada / iPhone'a. Użyj unsigned long long (lub uint64_t) i pobierz wartość z NSNumber jako 64-bitową liczbę int za pomocą unsignedLongLongValue.
źródło
Jeśli chcesz uzyskać pozostałe wolne miejsce za pomocą Swift, jest to nieco inne. Musisz użyć attributeOfFileSystemForPath () zamiast attributeOfItemAtPath ():
Edycja: Aktualizacja dla Swift 1.0
Edit 2: Aktualizacja dla bezpieczeństwa, korzystając odpowiedź Martina R jest .
Edycja 3: Zaktualizowano dla Swift 2.0 (przez dgellow )
źródło
Oto moja odpowiedź i dlaczego jest lepiej.
Odpowiedź (Szybka):
Odpowiedź (Cel-C):
Dlaczego jest lepiej:
NSByteCountFormatter
, co oznacza brak szalonych ręcznych obliczeń od bajtów do gigabajtów. Apple robi to za Ciebie!NSByteCountFormatter
zrób to za siebie. Np. Jeśli język urządzenia jest ustawiony na angielski, ciąg odczyta 248,8 MB, ale odczyta 248,8 Mo, gdy zostanie ustawiony na francuski, i tak dalej dla innych języków.źródło
Ważne wyjaśnienie (przynajmniej dla mnie). Jeśli podłączę iPoda do komputera Mac, są to informacje wyświetlane przez aplikację iTunes.
Kiedy używam powyższego kodu:
CountStyle NSByteCountFormatterCountStyleFile pokazuje mi: 17,41 GB
CountStyle NSByteCountFormatterCountStyleBinary pokaż mi: 16,22 GB
16,22 GB ( NSByteCountFormatterCountStyleBinary ) Jest to DOKŁADNIE liczba wyświetlana przez aplikację iTunes po podłączeniu iPoda do komputera Mac.
źródło
Zaktualizuj za pomocą nowego dokładnego interfejsu API, aby uzyskać dostępny rozmiar na dysku dostępny w systemie iOS11. Oto opis nowego klucza zasobów API:
Porównałem wyniki z klucza „ FileAttributeKey.systemFreeSize ” i klucza „ URLResourceKey.volumeAvailableCapacityForImportantUsageKey ” i stwierdziłem, że zwrócone wyniki z formularza „ volumeAvailableCapacityForImportantUsageKey ” dokładnie odpowiadają dostępnej pamięci pokazanej w UI. Oto szybka realizacja:
źródło
volumeAvailableCapacityForOpportunisticUsageKey
.NSHomeDirectory()
lubNSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
. Czy jest jakaś różnica w używaniu tych dwóch?Można znaleźć inne rozwiązanie z użyciem Swift 4 i
extension
który daje możliwość dobrego.Oto
UIDevice
rozszerzenie.I przykładowe użycie:
źródło
!
zamiast tego włóżguard
do sejfutypecasting
lubnil
sprawdź.W przypadku iOS> = 6.0 możesz użyć nowego
NSByteCountFormatter
. Ten kod pobiera liczbę wolnych bajtów pozostałych jako sformatowany ciąg.źródło
Poniższy kod jest implementacją wersji Swift 3.0 odpowiedzi udzielonej wcześniej przez ChrisJF:
źródło
dla Swift jako rozszerzenie UIDevice
Jak używać:
Wynik będzie:
źródło
Wiem, że ten post jest trochę stary, ale myślę, że ta odpowiedź może komuś pomóc. Jeśli chcesz poznać wykorzystane / wolne / całkowite miejsce na dysku na urządzeniu, możesz użyć Luminous . Jest napisane w języku Swift. Wystarczy zadzwonić:
lub
źródło
Szybka implementacja powyższego kodu: -
Zadzwoń z dowolnej innej klasy.
Podczas testowania zwracanej wartości jest taka sama, jak pokazują inne aplikacje. Przynajmniej w moim iPhonie 6S +. To tylko szybka implementacja powyższej odpowiedzi. A dla mnie zaakceptowana odpowiedź nie zadziałała.
źródło
Odpowiedź ChrisJF w wersji Swift 2.1 :
źródło
Jeśli chcesz zaoszczędzić czas, skorzystaj z poniższej biblioteki CocoaPod. Nie użyłem tego, ale wygląda na to, że powinno działać.
https://cocoapods.org/pods/SystemServices
źródło
Rozszerzenie Swift 5 zapewniające
FileManager
właściwą obsługę błędów i brak automatycznej konwersji ciągów (konwertuj liczbę bajtów na ciąg według własnego uznania). Następuje równieżFileManager
nazewnictwo.Przykładowe użycie:
źródło