Файл open() не существует, если файл действительно существует

Я пишу простой 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 ответа

При открытии файла произошла ошибка, но вы не знаете, что это произошло, потому что файл не был найден, потому что вы не проверили значение 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,

open не имеет второго параметра в виде строки. Вы используете open с параметрами fopen. Для веб-сервера fopen, fprintf, fclose - лучший выбор, чем более низкий уровень открытия, чтения, ...

Ура, Крис

Вам необходимо проверить, где выполняется ваша программа, поскольку она попытается открыть путь относительно этого места. Чтобы проверить использование:

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

Затем вы можете объединить свой путь, используя:

strncat(cwd, html_path, 100);

Вы можете обнаружить, что вам нужно перейти на один каталог или что-то еще, чтобы найти искомый файл.

Также обратите внимание, что если вы отлаживаете свою программу через gdb он может выполняться в другом месте, отличном от вашего обычного места сборки, что может затруднить обнаружение ошибок.

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