如何使用 stat 实用程序而不是 subpathsOfDirectoryAtPath 来计算目录大小

How to use stat utility instead of subpathsOfDirectoryAtPath to calculate directory size

我一直在使用 subpathsOfDirectoryAtPath:: 计算目录大小,但发现它非常缓慢。经过大量研究后,我发现了 stat 结构,可用于更快更有效地实现预期结果。我怎样才能在 swift 中使用 stat 来实现这个目标?

这是我当前的文件大小计算算法,使用 subpathsOfDirectoryAtPath:::

func calcSize(pathToDir: String) -> (Int) {
let fm = NSFileManager.defaultManager()
    var size = 0
    let fileArray = (fm.subpathsOfDirectoryAtPath(pathToDir, error: nil)) as! [String]
    for file in fileArray {
        autoreleasepool({
        var fileDict: NSDictionary? = fm.attributesOfItemAtPath(pathToDir.stringByAppendingPathComponent(file), error: nil)
        size += Int(fileDict!.fileSize())
        })
    }
    return (size)
}

PS。到目前为止我找到的所有结果在 objective-c 和 C 中都有答案,但在 swift.

中没有

这是Swift中的示例用法:

var stat1 : stat  = stat()
var documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! NSString
stat(documentsPath.fileSystemRepresentation,  &stat1)
println(stat1.st_size)

编辑

  var stat1 : stat  = stat()
        var size = 0
        let fileArray = (NSFileManager.defaultManager().subpathsOfDirectoryAtPath(pathToDir as String, error: nil)) as! [String]
        for file in fileArray {

            var stat1 : stat  = stat()
            var filex =  (pathToDir as String) + "/" +  file as NSString
            stat(filex.fileSystemRepresentation,  &stat1)
            if stat(filex.fileSystemRepresentation,  &stat1) != 0 {
                println("Some error occured ")
            } else {
                println(stat1.st_size)
            }
            size += Int(Double(stat1.st_size))                
    }
}

我建议您使用 NSFileManager.enumeratorAtURL(_:includingPropertiesForKeys:options:errorHandler:)。对于 属性 键,根据您的兴趣指定 [NSURLTotalFileSizeKey][NSURLTotalFileAllocatedSizeKey]。这将包括 stat() 不会包含的其他分叉和文件元数据.

然后您枚举目录中的项目,为每个项目获取 NSURLs。您使用 resourceValuesForKeys() 查询个人 NSURL 的尺码。 (我建议使用 getResourceValue(_:forKey:),但在 Swift 中可能有点尴尬。)

使用这种形式的枚举器的优点是它可以在枚举目录时预取大小 属性。这最终应该比 stat() 快。在底层,它使用 getdirentriesattr(),它结合了目录枚举和属性查询。