cocoa 应用程序是否有可能以int形式获取垃圾的大小。 NSTask
是执行此操作的正确方法吗?
最佳答案
没有简单的方法可以做到这一点。尽管Mac GUI提供了统一的废纸,,但不仅仅是废纸which是一回事。每个卷可以有一个单独的垃圾,卷可以来回移动。
另外,计算文件夹内容的大小可能会非常耗时,因此这似乎不是一个好主意。
如果您确实要这样做,则可以使用-[NSFileManager mountedVolumeURLsIncludingResourceValuesForKeys:options:]
之类的方法枚举所有已装入的卷,使用FSRef
将URL转换为CFURLGetFSRef()
,使用FSRef
从FSGetCatalogInfo()
获取卷参考号,将kFSCatInfoVolume
传递给whichInfo
,找到要删除的垃圾箱每个使用FSFindFolder()
传递每个kTrashFolderType
的folderType
的卷,使用FSRef
将生成的CFURLCreateFromFSRef()
转换为一个URL,使用-[NSFileManager enumeratorAtURL:includingPropertiesForKeys:options:errorHandler:
传递NSURLTotalFileAllocatedSizeKey
数组的keys
为该URL创建一个目录枚举器,通过该枚举器进行枚举,将每个项目的NSURLTotalFileAllocatedSizeKey
累加为NSNumber
,这些-unsignedLongLongValue
的NSNumber
。
实际上,使用FSGetVolumeInfo()
枚举卷可能更容易,将kFSInvalidVolumeRefNum
的volume
传递给volumeIndex
,将索引从1开始。您还可以将kFSVolInfoNone
传递给whichInfo
。您将增加索引并重复直到它返回nsvErr
为止。好处是,这可以直接为您提供卷参考号,因此您不必从URL到FSRef
到卷参考号。缺点是这是另一种旧式API。但是,您别无选择,只能使用这些API,因为上述内容无法替代FSFindFolder()
。
无论如何,当您枚举卷获得其废纸folders文件夹时,您必须准备好面对没有废纸folders文件夹的卷。例如,网络安装的卷通常没有。