Вычисление размера файла по пути к файлу в строке
Небольшая предпосылка: сервер получает сокетом сообщение "get text.txt". Я должен вычислить размер этого файла и отправить его обратно, так что вот код:
/*Receive command
*
*/
char * file_path;
//Wait for command
if ( recvfrom (sockfd_child, command, PACKET_SIZE, 0, (struct sockaddr *) addr_client, &addr_client_lenght) < 0) {
perror("server: error in recvfrom for command packet");
exit(1);
}
//check first 4 character (COMMAND_SIZE) of command packet send by the client to identify the operation
if (!strncmp(command, "get ", COMMAND_SIZE)) {
file_path = malloc(sizeof(command)-COMMAND_SIZE);
strcpy(file_path, DIRECTORY);
strncat(file_path, command+COMMAND_SIZE, PACKET_SIZE-COMMAND_SIZE);
printf("Getting file in path: '%s'\n", file_path);
int file_size = get_file_size(file_path);
Функция для расчета file_size
long get_file_size(char * file_name) {
long size;
FILE * file;
if ( !( file = fopen ( file_name , "rb" ) ) ) {
perror("file: error calculating size");
exit (1);
}
fseek (file , 0 , SEEK_END);
size = ftell (file);
rewind (file);
fclose(file);
return size;
}
DIRECTORY является константой и имеет значение./files/
COMMAND_SIZE установлен на 4
Сетевая часть программы работает хорошо, командная строка успешно передана.
программа останавливается в функции при печати perror file: error calculating size: No such file or directory
но предыдущий printf печатает точный путь, где находится файл Getting file in path: './files/text.txt'
Поэтому я предполагаю, что ошибка в том, как я отделяю путь к файлу от команды 'get' или где-то еще, что я не могу понять. Вы можете мне помочь? Извините за любую ошибку или замешательство, но это 4:00 утра здесь:)
2 ответа
Смотрите ваш malloc(). Это только выделить sizeof(command)-COMMAND_SIZE
за file_path
, Но это нужно хранить strlen(DIRECTORY) + sizeof(command)-COMMAND_SIZE
, strncat()
а также printf()
не проверяйте, будет ли массив выходить за границы, чтобы получить правильный вывод file_path
,
Вы можете заменить file_name
с ./files/text.txt
в get_file_size()
проверить это.
Это будет звучать очевидно, но попробуйте "printf", чтобы проверить имя файла и путь к нему. Может быть, есть проблема с пробелами или что-то. Кстати, вы можете использовать сценарии для расчета размера файла (если вы используете Linux, у вас много команд для этого) и передать значение в качестве аргумента программе.