文件实际存在时,open()文件不存在

时间:2016-02-23 21:02:22

标签: c file file-exists

我正在编写一个简单的HTTP服务器,当文件存在时我得到的文件不存在返回值

printf("%s\n", html_path);
if ((fd = open(html_path, "r")) >= 0){ //file found

  stat(file_name, &st);
  file_size = st.st_size;
  printf("%d\n", file_size);
  while (read(fd, response, RCVBUFSIZE) > 0){

  }
}
else { //file not found
    strcpy(response, "404 File not found\n");
    send(clntSocket, response, 32, 0);
}

print语句用于验证路径,它看起来像这样:

/mounts/u-zon-d2/ugrad/kmwe236/HTML/index.html

请注意,此路径位于我们在大学使用的服务器上。它是我命令pwd

时显示的路径

我已确认该文件存在。我的道路有问题吗?

3 个答案:

答案 0 :(得分:2)

打开文件时出错,但您不知道是因为找不到文件,因为您没有检查errno的值。

else部分,添加以下内容:

else { //file not found
    // copy the value of errno since other function calls may change its value
    int err = errno;
    if (err == ENOENT) {
        strcpy(response, "404 File not found\n");
        send(clntSocket, response, 32, 0);
    } else {
        printf("file open failed: error code %d: %s\n", err, strerror(err));
    }
}

如果文件实际上不存在,您将正确处理错误。如果没有,您将打印一条错误消息,告诉您发生了什么。

您还错误地致电open。第二个参数是包含标志的int。要打开文件进行阅读,请使用O_RDONLY

答案 1 :(得分:1)

open没有第二个参数作为字符串。你使用open参数fopen。 对于一个网络服务器fopen,fprintf,fclose是一个更好的选择,然后更低级别的开放,阅读,......

干杯, 克里斯

答案 2 :(得分:0)

您需要检查程序执行的位置,因为它会尝试打开相对于该位置的路径。检查使用:

char cwd[1024];
getcwd(cwd, sizeof(cwd));
puts(cwd);

然后你可以使用以下方法连接你的路径:

strncat(cwd, html_path, 100);

您可能会发现必须上一个目录或其他内容才能找到您要查找的文件。

另请注意,如果您通过gdb调试程序,则可能会从常规构建位置的其他位置执行,这可能会更难发现错误。