Я работаю над назначением в программировании сокетов, в котором я должен отправить файл между sparc и linux машиной. Перед отправкой файла в поток char я должен получить размер файла и сообщить клиенту. Вот некоторые из способов, которыми я пытался получить размер, но я не уверен, какой из них правильный.Правильный способ получить размер файла в C
Для целей тестирования я создал файл с содержанием "тестом" (пробел + (строка) тесты)
Метод 1 - Используя fseeko() и ftello()
Это метод Я нашел на https://www.securecoding.cert.org/confluence/display/c/FIO19-C.+Do+not+use+fseek()+and+ftell()+to+compute+the+size+of+a+regular+file В то время как fssek() имеет проблему «Установка индикатора положения файла в конец файла, как и в файле fseek (файл, 0, SEEK_END), имеет неопределенное поведение для двоичного потока», fseeko() как говорят, решает эту проблему, но он работает только в системе POSIX (это нормально, потому что среда, которую я использую, является sparc и linux)
fd = open(file_path, O_RDONLY);
fp = fopen(file_path, "rb");
/* Ensure that the file is a regular file */
if ((fstat(fd, &st) != 0) || (!S_ISREG(st.st_mode))) {
/* Handle error */
}
if (fseeko(fp, 0 , SEEK_END) != 0) {
/* Handle error */
}
file_size = ftello(fp);
fseeko(fp, 0, SEEK_SET);
printf("file size %zu\n", file_size);
Этот метод работает нормально и получает размер правильно. Однако он ограничен только обычными файлами. Я попытался использовать термин «обычный файл», но я до сих пор не совсем понимаю его. И я не знаю, надежна ли эта функция для моего проекта.
Метод 2 - Использование StrLen()
С макс. размер файла в моем проекте составляет 4 МБ, поэтому я могу просто вызывать 4 МБ буфер. После этого файл считывается в буфер, и я попытался использовать strlen, чтобы получить размер файла (или, вернее, длину содержимого). Поскольку strlen() переносима, могу ли я использовать этот метод вместо этого? Фрагмент кода, как этот
fp = fopen(file_path, "rb");
fread(file_buffer, 1024*1024*4, 1, fp);
printf("strlen %zu\n", strlen(file_buffer));
Этот метод работает также и возвращает
strlen 8
Однако, я не мог видеть любой подобный подход в Интернете с помощью этого метода. Поэтому я думаю, может быть, я что-то упустил или есть некоторые ограничения такого подхода, которые я не понял.
Почему вы используете 'strlen()', когда 'fread()' уже сообщает, сколько он читает, а 'strlen()' останавливается при первом nul-байте? –
Возможный дубликат [Использование fseek и ftell для определения размера файла имеет уязвимость?] (Http://stackoverflow.com/questions/5957845/using-fseek-and-ftell-to-determine-the-size- из-a-file-has-a-уязвимость) – anatolyg
Также связано: http://stackoverflow.com/a/21050963/509868 – anatolyg