Size 使用fseek()获取硬盘大小

Size 使用fseek()获取硬盘大小,size,hard-drive,fseek,Size,Hard Drive,Fseek,我一直在尝试使用fseek()获取linux系统上的硬盘大小 我有一个函数,它应该返回正确的大小: unsigned long long getsize(FILE *fp){ unsigned long long prev=ftell(fp); fseek(fp,0,SEEK_END); unsigned long long size=ftell(fp); fseek(fp,prev,SEEK_SET); return size; } 但当我在硬盘上使用

我一直在尝试使用fseek()获取linux系统上的硬盘大小

我有一个函数,它应该返回正确的大小:

unsigned long long getsize(FILE *fp){
    unsigned long long prev=ftell(fp);
    fseek(fp,0,SEEK_END);
    unsigned long long size=ftell(fp);
    fseek(fp,prev,SEEK_SET);
    return size;
}
但当我在硬盘上使用它时,它返回18446744073709551615或2^64-1


它似乎并不总是归还它。因为我可以在文件上使用它。我以前也做过硬盘方面的工作。

你会得到这样的结果,因为这不是获得磁盘大小的正确方法

如果要检查磁盘大小,应在磁盘fd上发出一个ioctl(),请求为BLKGETSIZE64(参数为指向long的指针)

长磁盘大小;
ioctl(、BLKGETSIZE64和磁盘大小);

如果您对文件系统大小(可能不同)或文件系统上的空白空间感兴趣,请使用
statvfs()
call。

谢谢您,这很有效!如果fseek不被允许,我还有一个问题。我正在编写一个小脚本,用于检查硬盘上特定偏移量下的特定字节。我可以使用fseek和fread吗?seek可能会起作用,但是如果你只检查一些值,为什么不使用pread()/fread()?它逐扇区读取数据,我用数学方法指定偏移量,这样使用fseek比使用fread更容易
long long disk_size;
ioctl(<disk_fd>, BLKGETSIZE64, &disk_size);