2011-04-27 100 views
1

如果我有一个安装点,我如何获得本地安装在该安装点上的文件系统支持的最大文件大小?OSX:如何获得给定文件系统的最大文件大小

我试过statfs(2),statvfs(2),但似乎没有提到文件大小限制。我尝试捕获'diskutil listFilesystems -plist'输出,但它只提到每个fs的分区大小的最小/最大限制。任何其他想法?

回答

0

VFS层不公开这个数据,所以没有。你所能做的就是尝试创建一个文件并检查EFBIG。

1

获取一个NSURL实例指的是文件系统的挂载点(实际上是一个URL安装的文件系统中提及任何将工作太)然后调用getResourceValue:forKey:错误:或resourceValuesForKeys:错误:为取得用于NSURLVolumeMaximumFileSizeKey值。

检查NSURL类参考了解更多信息。

0

我发现Linux下的lseek会在文件所在的文件系统超出最大支持文件大小的情况下返回一个错误,而不必写出任何数据。您可以执行简单的二进制搜索以获得最大支持的文件大小。它通常是导致寻道错误-1的第一个幂,因此只需在循环中左移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来实现,并且不能满足我的需求。

每次挂载新文件系统时都会创建一个大文件威盛USB并不是一个可以接受的解决方案。我在做这件事的尝试导致了长时间的停顿,因为操作系统正在悄悄地将两个部门之间的部门调零。我甚至无法截断或取消链接文件,直到操作完成。如果您插入USB驱动器以将文件下载到该驱动器,以便让您的驱动器在试图测试最大文件大小的同时挂上驱动器10分钟,您会有多愤怒?应用程序如何处理第一次安装时驱动器几乎已满的情况?

如果fstatfs返回了这个信息,那将会非常好。

相关问题