Вычисление размера файла по пути к файлу в строке

Небольшая предпосылка: сервер получает сокетом сообщение "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, у вас много команд для этого) и передать значение в качестве аргумента программе.

Другие вопросы по тегам