如何使用Cocoa找到已安装卷上的可用空间量?

时间:2008-11-04 21:29:38

标签: cocoa macos volumes

我使用以下代码确定卷上的可用空间。 该文件夹是使用NSOpenPanel提供的。所选项目是已装入的卷,返回的路径为\ Volumes \ Name

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

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

使用Cocoa确定已装载卷上的可用空间是否有更好的方法?

更新:这实际上是确定卷上可用空间的最佳方法。它似乎没有用,但这是因为文件夹实际上是/ Volumes而不是/ Volume / VolumeName

2 个答案:

答案 0 :(得分:3)

提供的代码是Cocoa中确定卷上可用空间的最佳方式。 只需确保提供给[NSFileManagerObj fileSystemAttributesAtPath]的路径包含卷的完整路径。我正在删除最后一个路径组件,以确保传递文件夹而不是文件,导致/ Volumes被用作不能提供正确结果的文件夹。

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

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

答案 1 :(得分:1)

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);
}