Как определить количество свободного места на подключенном томе с помощью какао? - PullRequest
2 голосов
/ 05 ноября 2008

Я использую следующий код для определения свободного места на томе. Папка была предоставлена ​​с использованием NSOpenPanel. Выбранный элемент представлял собой подключенный том, а возвращенный путь был \ Volumes \ Name

NSDictionary* fileAttributes = [[NSFileManager defaultManager] fileSystemAttributesAtPath:folder];

unsigned long long size = [[fileAttributes objectForKey:NSFileSystemFreeSize] longLongValue];    

Есть ли лучший способ определения свободного места на подключенном томе с помощью какао?

Обновление: на самом деле это лучший способ определить свободное место на томе. Оказалось, что это не работает, но это было связано с тем, что на самом деле папка была / Volumes, а не / Volume / VolumeName

Ответы [ 2 ]

3 голосов
/ 06 ноября 2008

Предоставленный код является лучшим способом в Какао для определения свободного места на томе. Просто убедитесь, что путь к [NSFileManagerObj fileSystemAttributesAtPath] содержит полный путь к тому. Я удалял последний компонент пути, чтобы обеспечить передачу папки, а не файла, в результате чего / Volumes использовался в качестве папки, которая не дает правильных результатов.

NSDictionary* fileAttributes = [[NSFileManager defaultManager] fileSystemAttributesAtPath:folder];

unsigned long long size = [[fileAttributes objectForKey:NSFileSystemFreeSize] longLongValue];    
1 голос
/ 05 ноября 2008

statfs согласуется с результатами df. Теоретически NSFileSystemFreeSize происходит от statfs, поэтому ваша проблема не должна существовать.

Вы можете запустить statfs, как показано ниже, в качестве замены NSFileSystemFreeSize:

#include <sys/param.h>
#include <sys/mount.h>

int main()
{
    struct statfs buf;

    int retval = statfs("/Volumes/KINGSTON", &buf);

    printf("KINGSTON Retval: %d, fundamental file system block size %ld, total data blocks %d, total in 512 blocks: %ld\n",
            retval, buf.f_bsize, buf.f_blocks, (buf.f_bsize / 512) * buf.f_blocks); 
    printf("Free 512 blocks: %ld\n",  (buf.f_bsize / 512) * buf.f_bfree); 
    exit(0);
}
...