我正在尝试使用java的statvfs调用获取/文件夹上的可用空间,

我已经从c检查了statvfs结构的大小,它显示了44个字节,我使用java.nio.ByteBuffer.allocateDirect分配了一个字节缓冲区44个字节,并将其顺序设置为44个字节。
当我调用statvfs时,我得到的返回值为0,因此我假设调用成功,但是我似乎无法使用buffer.getInt返回512Buffer_bsize,这是正确的,但是在此之后我无法读取,因此我无法从ByteBuffer中获取信息。 。

buffer.getInt(12)应该给我f_blocks但我得到0。

unsigned long   f_bsize;    /* File system block size */
unsigned long   f_frsize;   /* Fundamental file system block size */
fsblkcnt_t  f_blocks;   /* Blocks on FS in units of f_frsize */


还是我的逻辑上有毛病?

最佳答案

不是解决方案,而是一些想法。


您应该检查fsblkcnt_t类型的大小。我非常肯定,它是4个字节,但这只是基于整个结构的44个字节的假设。
我认为,f_blocks字段的第一个字节的索引是8,而不是12。f_bsizef_frsize分别是4个字节,总共是8个字节,下一个值从索引的第九个位置开始8。
我对您的“订单”设置有些困惑。它不应为“ 44”,而应为Byteorder.BIG_ENDIANByteOrder.LITTLE_ENDIAN。但这可能只是您输入中的错字


您是否尝试过转储缓冲区内容或使用调试器来窥视缓冲区?它保持期望值吗?只是为了解决问题是否与填充或读取缓冲区有关。

10-08 17:16