Как получить длину файла в C на Linux? - PullRequest
0 голосов
/ 01 мая 2018

Я ищу эквивалент _filelength от Microsoft в Linux. Я пробовал это, но это неверно.

long _filelength(char *f)
{
    struct stat st;
    stat(f, &st);
    return st.st_size;
}

if((hfile = fopen("data.arp","rb"))!=NULL)
    fsize = _filelength(fileno(hfile));

Как узнать длину файла в C в Linux?

Ответы [ 3 ]

0 голосов
/ 01 мая 2018

Вы должны искать файл.

fseek(file, 0L, SEEK_END);

Тогда получите текущую позицию:

fileSize = ftell(file);

Затем, чтобы вернуть позицию в начало, используйте:

rewind(file);
0 голосов
/ 02 мая 2018
FILE *fp = fopen("filename", "rb");
fseek(fp, 0, SEEK_END);
int lengthOfFile = ftell(fp);
fclose(fp);
0 голосов
/ 01 мая 2018

Я ищу эквивалент _filelength в Linux.

Это очень неправильный подход и показывает неправильное мышление. В Linux нет точного эквивалента _filelength для Windows. Linux не Windows и Windows не Linux. Каждая операционная система имеет свой собственный API и свое видение файлов (в Linux они являются inode, см. inode (7) , а также этот ответ .. .), процессы и т. д. Linux в основном совместим с POSIX, поэтому изучите POSIX и прочитайте некоторую книгу по системному программированию в Linux, возможно, старый ALP или что-то более новое. Не ожидайте (и даже не пытайтесь) найти эквивалент каждой функции Windows или WinAPI в Linux. См. intro (2) , syscalls (2) , intro (3) .

Подробнее читайте stat (2) . Он принимает строку (некоторый путь к файлу), а не дескриптор файла (как это делает fstat), как тот, который задан fileno (3) . Он может потерпеть неудачу (и вам нужно понять, почему, вероятно, используется errno (3) , который никогда не бывает отрицательным).

Кстати, идентификаторы с именем, начинающимся с _, зарезервированы.

Возможно, вы могли бы попробовать:

long filelength(const char*filpath) { // don't use that. Learn POSIX API
   struct stat st;
   if (stat(filpath, &st)) /*failure*/
      return -1; // when file does not exist or is not accessible
   return (long) st.st_size;
}

но на практике вам лучше использовать stat непосредственно в вашей программе (и проверять errno (3) при сбое , а не просто возвращать -1, как я делал выше ), и вам, вероятно, следует использовать другие метаданные, возвращаемые stat.

Linux (и Unix) также имеют разреженные файлы , жесткие ссылки , файлы устройств , символические ссылки , анонимные файлы (например, все еще открытые inode, но больше не присутствуют в файловой системе), fifo (7) -s, unix (7) сокетов и т. д .... Возможно, вам нужно обрабатывать их (но у них нет точного эквивалента в Windows).

Читайте также Операционные системы: Three Easy Pieces

Вы можете использовать многоплатформенные фреймворки, такие как Poco или Boost или Qt . Они пытаются предоставить некоторую общую абстракцию над несколькими операционными системами (но некоторые детали все еще имеют значение и их трудно скрыть или абстрагировать; например, файл путь не совпадает в Windows и в Linux. См. path_resolution (7) ...)

Вы должны скомпилировать все предупреждения и отладочную информацию (поэтому gcc -Wall -Wextra -g с GCC ). Затем используйте gdb отладчик . Вы также можете использовать strace (1) для понимания системных вызовов , выполняемых вашей программой.

...