Как вы узнаете, сколько дискового пространства осталось в Какао? - PullRequest
8 голосов
/ 26 октября 2009

Полагаю, я бы хотел найти любое хранилище, не только системный диск, но это самое главное.

Ответы [ 7 ]

14 голосов
/ 26 октября 2009
10 голосов
/ 29 октября 2009

EDIT fileSystemAttributesAtPath: устарело, используйте attributeOfFileSystemForPath: error: как предложено NSD. Я сделал ошибку, когда подумал, что это не сработало.

// this works
NSError *error = nil;
NSDictionary *attr = [NSFM attributesOfFileSystemForPath:@"/" error:&error];
if (!error) {
    double bytesFree = [[attr objectForKey:NSFileSystemFreeSize] doubleValue];
}

Я попробовал это, attributeOfItemAtPath: ошибка, но возвращенный дикт, похоже, не имел ключа NSFileSystemFreeNodes.

NSFileManager *fm = [NSFileManager defaultManager];
NSError *error = nil;
NSDictionary *attr = [fm attributesOfItemAtPath:@"/" error:&error];
if (!error) {
    NSLog(@"Attr: %@", attr);
}

2009-10-28 17:21:11.936 MyApp[33149:a0b] Attr: {
    NSFileCreationDate = "2009-08-28 15:37:03 -0400";
    NSFileExtensionHidden = 0;
    NSFileGroupOwnerAccountID = 80;
    NSFileGroupOwnerAccountName = admin;
    NSFileModificationDate = "2009-10-28 15:22:15 -0400";
    NSFileOwnerAccountID = 0;
    NSFileOwnerAccountName = root;
    NSFilePosixPermissions = 1021;
    NSFileReferenceCount = 40;
    NSFileSize = 1428;
    NSFileSystemFileNumber = 2;
    NSFileSystemNumber = 234881026;
    NSFileType = NSFileTypeDirectory;
}

После просмотра создается впечатление, что fileSystemAttributesAtPath: это метод, который его возвращает. Weird.

NSFileManager *fm = [NSFileManager defaultManager];
NSDictionary *attr = [fm fileSystemAttributesAtPath:@"/"]; 
NSLog(@"Attr: %@", attr);


2009-10-28 17:24:07.993 MyApp[33283:a0b] Attr: {
    NSFileSystemFreeNodes = 5027061;
    NSFileSystemFreeSize = 20590841856;
    NSFileSystemNodes = 69697534;
    NSFileSystemNumber = 234881026;
    NSFileSystemSize = 285481107456;
}
9 голосов
/ 15 апреля 2010

Я использую это:

NSDictionary* fileAttributes = [[NSFileManager defaultManager] attributesOfFileSystemForPath:@"/"
                                                                                   error:&error];
unsigned long long freeSpace = [[fileAttributes objectForKey:NSFileSystemFreeSize] longLongValue];
NSLog(@"free disk space: %dGB", (int)(freeSpace / 1073741824));
1 голос
/ 15 апреля 2016

С помощью swift вы можете получить свободное место с помощью этой функции

func getFreeSpace() -> CGFloat {
      do {
         let fileAttributes = try NSFileManager.defaultManager().attributesOfFileSystemForPath("/")
         if let size = fileAttributes[NSFileSystemFreeSize] as? CGFloat {
            return size
         }
      } catch { }
      return 0
   }
0 голосов
/ 11 мая 2018

Swift 3.0-4.0 на MacOS

Я сделал это для macOS, и у меня не было проблем. Вывод в байтах, поэтому вы должны разделить его на 1024.

func getHD() -> String {
    do {
        let du = try FileManager.default.attributesOfFileSystem(forPath: "/")
        if let size = du[FileAttributeKey.systemFreeSize] as? Int64 {
            return (String(size / 1024 / 1024 / 1024) + "GB")
        }
        debugPrint(du)
    }
    catch {
        debugPrint(error)
        return "Check Failed"
    }
    return "Checking..."
}

FileManager.default.attributesOfFileSystem(forPath: "/") просто получает различные атрибуты, доступные для файловой системы корневого каталога. Одним из таких атрибутов является свободное дисковое пространство.

du[FileAttributeKey.systemFreeSize] as? Int64

Вы получаете доступ к этому ключу (ключ: значение) и вводите его в Int, чтобы получить свободное место на диске.

0 голосов
/ 27 мая 2014

Получить от этого поста :

- (uint64_t)freeDiskspace
{
    uint64_t totalSpace = 0;
    uint64_t totalFreeSpace = 0;

    __autoreleasing NSError *error = nil;  
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
    NSDictionary *dictionary = [[NSFileManager defaultManager] attributesOfFileSystemForPath:[paths lastObject] error: &error];  

    if (dictionary) {  
        NSNumber *fileSystemSizeInBytes = [dictionary objectForKey: NSFileSystemSize];  
        NSNumber *freeFileSystemSizeInBytes = [dictionary objectForKey:NSFileSystemFreeSize];
        totalSpace = [fileSystemSizeInBytes unsignedLongLongValue];
        totalFreeSpace = [freeFileSystemSizeInBytes unsignedLongLongValue];
        NSLog(@"Memory Capacity of %llu MiB with %llu MiB Free memory available.", ((totalSpace/1024ll)/1024ll), ((totalFreeSpace/1024ll)/1024ll));
    } else {  
        NSLog(@"Error Obtaining System Memory Info: Domain = %@, Code = %d", [error domain], [error code]);  
    }  

    return totalFreeSpace;
}

Основное различие заключается в том, что вы должны использовать NSSearchPathForDirectioriesInDomains, в противном случае я получаю правильное значение на симуляторе, но ссылка на папку устройства / возвращает мне что-то вроде 190 МБ, что было неправильно.

0 голосов
/ 20 февраля 2014

Производители устройств с жестким диском, используйте:

1 ГБ = 1000 МБ

1 МБ = 1000 КБ и т.д.

Если вы видите, что USB-флешка объемом 8 ГБ в Windows всегда показывает меньше места, чем реальная (например, 7,8 ГБ), поскольку считается, что 1 ГБ = 1024 МБ). В OSX тот же USB-накопитель имеет 8 ГБ (настоящих).

поэтому (freeSpace / 1073741824) должно быть (freeSpace / 1000000000)

как минимум в OSX

...