如果我有一个挂载点,如何获得本地挂载在该挂载点上的文件系统支持的最大文件大小?
我尝试过statfs(2),statvfs(2),但似乎没有提到文件大小限制。我尝试捕获'diskutil listFilesystems -plist'输出但它只提到每个fs的分区大小的最小/最大限制。还有其他想法吗?
答案 0 :(得分:1)
获取一个引用文件系统mountpoint的NSURL实例(事实上,引用已挂载文件系统中任何内容的URL也可以工作)然后调用getResourceValue:forKey:error:或resourceValuesForKeys:error:获取NSURLVolumeMaximumFileSizeKey的值。
查看NSURL类参考以获取更多信息。
答案 1 :(得分:0)
VFS层不会公开这些数据,所以没有。您所能做的就是尝试创建一个文件并检查EFBIG。
答案 2 :(得分:0)
我发现Linux下的lseek如果超出文件所在文件系统所支持的最大文件大小而不必写出任何数据,则会返回错误。您可以执行简单的二进制搜索以获得最大支持的文件大小。它通常是导致搜索错误-1的第一个2的幂,所以简单地在循环中移位0x1直到fseek返回错误然后尝试结果值-1可能会很快到达那里。只需确保使用-D_FILE_OFFSET_BITS = 64编译代码,或者使用弃用的-D_LARGEFILE64_SOURCE并使用lseek64。
这似乎不适用于Windows或OS X.似乎lseek不会在这些实现中进行边界检查。到目前为止,我在c ++中能做的最好的事情是查看Windows中GetVolumeInformation返回的文件系统类型字符串或OS X中64位版本的fstatfs并返回理论限制并希望我没有运行到任何以前看不见的文件系统。确保在OS X下编译时定义_DARWIN_USE_64_BIT_INODE。使用NSURL并获取如下所述的NSURLVolumeMaximumFileSizeKey资源值似乎需要Objective-c来实现并且不能满足我的需求。
每次挂载新文件系统时都要创建一个大文件VIA USB不是一个可接受的解决方案。我这样做的尝试导致长时间停滞,因为操作系统默默地将两者之间的扇区归零。在操作完成之前,我甚至无法截断或取消链接文件。如果您插入USB驱动器下载文件只是让您使用的应用程序在尝试测试最大文件大小时将驱动器挂起10分钟,您会有多生气?应用程序如何处理首次安装时驱动器几乎已满的情况?
如果fstatfs返回此信息,那将非常好。