Я заметил, что когда я запрашиваю размер устройства с помощью open
+ lseek
, все в порядке, но когда я stat
устройство, я получаю ноль вместо реального размера устройства. Устройство чистое без какой-либо файловой системы, и первые байты устройства начинаются с некоторого текста, такого как "1234567890ABC". Что случилось?
Код:
#include <sys/stat.h>
#include <dirent.h>
bool
GetFileSize(const char* pPath, uint64_t& Size)
{
pPath = "/home/sw/.bashrc";
pPath = "/dev/sda";
struct stat buffer;
if (stat(pPath, &buffer))
{
printf("Failed to stat file. Error: %s. FilePath: %s\n", strerror(errno), pPath);
return false;
}
printf("File size by stat: %" PRIu64 " WTF?\n", buffer.st_size);
//
// Note: It strange, but stat::st_size from the stat call is zero for devices
//
int File = open(pPath, O_RDONLY);
if (File < 0)
{
printf("Failed to open file. Error: %s. FilePath: %s\n", strerror(errno), pPath);
return false;
}
long off = lseek(File, 0, SEEK_END);
if (off == (off_t)-1)
{
printf("Failed to get file size. Error: %s. FilePath: %s\n", strerror(errno), pPath);
close(File);
return false;
}
close(File);
printf("File size by lseek: %" PRIu64 "\n", off);
fflush(stdout);
Size = off;
return true;
}
Выход:
File size by stat: 0 Huh?
File size by lseek: 34359738368
Если я использую stat для обычного файла, тогда все в порядке (закомментируйте строку с "/dev/sda"):
File size by stat: 4019 Huh?
File size by lseek: 4019