从字符串中的文件路径计算文件大小

时间:2015-01-18 03:01:23

标签: c file network-programming

一个小前提:服务器正在通过套接字接收消息" 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'
所以我猜错误在于我如何将文件路径与命令分开来得到&#39; get&#39;或者其他我无法掌握的地方。你能帮助我吗?对不起任何错误或混淆,但在这里凌晨4点:)

2 个答案:

答案 0 :(得分:0)

听起来很明显,但请尝试使用“printf”来验证文件的名称及其路径。也许空白或其他东西有问题。顺便说一句,你可以使用脚本来计算文件的大小(如果你在linux中,你有很多命令要做),并将值作为参数传递给程序。

答案 1 :(得分:0)

查看你的malloc()。它仅为sizeof(command)-COMMAND_SIZE分配file_path。但它需要存储strlen(DIRECTORY) + sizeof(command)-COMMAND_SIZEstrncat()printf()不会检查数组是否会超出范围,因此您可以获得file_path的正确输出。

您可以将file_name替换为./files/text.txt中的get_file_size()进行检查。