如何使用 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()
不会包含的其他分叉和文件元数据.
然后您枚举目录中的项目,为每个项目获取 NSURL
s。您使用 resourceValuesForKeys()
查询个人 NSURL
的尺码。 (我建议使用 getResourceValue(_:forKey:)
,但在 Swift 中可能有点尴尬。)
使用这种形式的枚举器的优点是它可以在枚举目录时预取大小 属性。这最终应该比 stat()
快。在底层,它使用 getdirentriesattr()
,它结合了目录枚举和属性查询。
我一直在使用 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()
不会包含的其他分叉和文件元数据.
然后您枚举目录中的项目,为每个项目获取 NSURL
s。您使用 resourceValuesForKeys()
查询个人 NSURL
的尺码。 (我建议使用 getResourceValue(_:forKey:)
,但在 Swift 中可能有点尴尬。)
使用这种形式的枚举器的优点是它可以在枚举目录时预取大小 属性。这最终应该比 stat()
快。在底层,它使用 getdirentriesattr()
,它结合了目录枚举和属性查询。