cocoa 应用程序是否有可能以int形式获取垃圾的大小。 NSTask是执行此操作的正确方法吗?

最佳答案

没有简单的方法可以做到这一点。尽管Mac GUI提供了统一的废纸,,但不仅仅是废纸which是一回事。每个卷可以有一个单独的垃圾,卷可以来回移动。

另外,计算文件夹内容的大小可能会非常耗时,因此这似乎不是一个好主意。

如果您确实要这样做,则可以使用-[NSFileManager mountedVolumeURLsIncludingResourceValuesForKeys:options:]之类的方法枚举所有已装入的卷,使用FSRef将URL转换为CFURLGetFSRef(),使用FSRefFSGetCatalogInfo()获取卷参考号,将kFSCatInfoVolume传递给whichInfo,找到要删除的垃圾箱每个使用FSFindFolder()传递每个kTrashFolderTypefolderType的卷,使用FSRef将生成的CFURLCreateFromFSRef()转换为一个URL,使用-[NSFileManager enumeratorAtURL:includingPropertiesForKeys:options:errorHandler:传递NSURLTotalFileAllocatedSizeKey数组的keys为该URL创建一个目录枚举器,通过该枚举器进行枚举,将每个项目的NSURLTotalFileAllocatedSizeKey累加为NSNumber,这些-unsignedLongLongValueNSNumber

实际上,使用FSGetVolumeInfo()枚举卷可能更容易,将kFSInvalidVolumeRefNumvolume传递给volumeIndex,将索引从1开始。您还可以将kFSVolInfoNone传递给whichInfo。您将增加索引并重复直到它返回nsvErr为止。好处是,这可以直接为您提供卷参考号,因此您不必从URL到FSRef到卷参考号。缺点是这是另一种旧式API。但是,您别无选择,只能使用这些API,因为上述内容无法替代FSFindFolder()

无论如何,当您枚举卷获得其废纸folders文件夹时,您必须准备好面对没有废纸folders文件夹的卷。例如,网络安装的卷通常没有。

10-07 18:34