如何在可可中获取目录的大小和可用空间?

时间:2013-07-01 10:29:50

标签: objective-c macos cocoa nsfilemanager

我想访问目录的实际大小,以及目录中的可用空间。 我已经使用[NSFileManager defaultManager] attributesOfItemAtPath:path error:& error]方法。 此方法适用于文件,但对于目录,它不提供实际值。请帮忙解决这个问题。 提前谢谢。

3 个答案:

答案 0 :(得分:3)

您可以使用此特定方法计算目录的大小,最快,使用Carbon,而不是NSEnumerator: here

要计算可用空间,可以使用该方法。确保输入卷的完整路径:

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

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

大小是你正在寻找的。

答案 1 :(得分:2)

通过swift,您可以使用此功能获得可用空间

func getFreeSpace() -> CGFloat {
      do {
         let fileAttributes = try NSFileManager.defaultManager().attributesOfFileSystemForPath("/")
         if let size = fileAttributes[NSFileSystemFreeSize] as? CGFloat {
            return size
         }
      } catch { }
      return 0
   }

答案 2 :(得分:0)

#include <sys/stat.h>
#include <dirent.h>

-(unsigned long long)getFolderSize : (NSString *)folderPath;
{
    char *dir = (char *)[folderPath fileSystemRepresentation];
    DIR *cd;

    struct dirent *dirinfo;
    int lastchar;
    struct stat linfo;
    static unsigned long long totalSize = 0;

    cd = opendir(dir);

    if (!cd) {
        return 0;
    }

    while ((dirinfo = readdir(cd)) != NULL) {
        if (strcmp(dirinfo->d_name, ".") && strcmp(dirinfo->d_name, "..")) {
            char *d_name;


            d_name = (char*)malloc(strlen(dir)+strlen(dirinfo->d_name)+2);

            if (!d_name) {
                //out of memory
                closedir(cd);
                exit(1);
            }

            strcpy(d_name, dir);
            lastchar = strlen(dir) - 1;
            if (lastchar >= 0 && dir[lastchar] != '/')
                strcat(d_name, "/");
            strcat(d_name, dirinfo->d_name);

            if (lstat(d_name, &linfo) == -1) {
                free(d_name);
                continue;
            }
            if (S_ISDIR(linfo.st_mode)) {
                if (!S_ISLNK(linfo.st_mode))
                    [self getFolderSize:[NSString stringWithCString:d_name encoding:NSUTF8StringEncoding]];
                free(d_name);
            } else {
                if (S_ISREG(linfo.st_mode)) {
                    totalSize+=linfo.st_size;
                } else {
                    free(d_name);
                }
            }
        }
    }

    closedir(cd);

    return totalSize;

}  

您也可以使用du命令。

  

du - 显示磁盘使用情况统计信息