【问题标题】:How to get Size and free space of a directory in cocoa?如何在可可中获取目录的大小和可用空间?
【发布时间】:2013-06-28 10:42:59
【问题描述】:

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

【问题讨论】:

  • 目录没有“可用空间”;可用空间是目录所在文件系统的属性。我想你想要stat(2) 和/或statfs(2)

标签: objective-c macos cocoa nsfilemanager


【解决方案1】:

您可以使用 Carbon 而不是 NSEnumerator 使用这种最快的方法来计算目录的大小: here

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

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

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

尺寸就是您要寻找的东西。

【讨论】:

  • 应该注意的是(不幸的是)大多数 Carbon 函数都被标记为已弃用。例如,在您链接到的代码中使用的 FSGetCatalogInfoBulk() 从 OS X 10.8 开始已被弃用。它可能仍然有效,但应牢记这一点以备不时之需。
  • unsigned long long size = [[fileAttributes objectForKey:NSFileSystemFreeSize] longLongValue];我检查了这个方法的根,但它没有给出正确的值。
  • @MartinR 你说的完全正确,谢谢你带来这个。 Surjeet,你走对路了吗?因为它对我有用。
  • @ceache 是的,我输入了正确的路径,除了大小之外,我得到了有关目录的所有信息
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:
    #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 -- 显示磁盘使用统计信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 2013-10-28
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多