Я говорю о том, что считается (как и в Документации сказано) "файл есть" - это там где false у функции os.IsNotExist(). В этом суть моей поправки.
Все остальное тоже верно.
Это понятно - что нюансы есть.
Но вот конкретно ваш первоначальный код для конкретно моей задачи проверки наличия файла для его отдачи в ответ на URL-запрос - не подходит, ибо там внешний-первый if мешается. А "общий" код из Документации - самое то.
> там может быть что угодно, открытие файла и чтение данных, удаление файла, ...
Это всё у функции os.Stat()? (Речь же про неё.)
> не факт, что когда другая ошибка, файл существует.
> Например, у вас вышел из строя ссд, ...
Может и не факт. Но другого инструмента у нас нет. Сказано в Документации (и общей практикой): вот эту "другую ошибку" считать за наличие файла - значит так и считаем.
...Если вникнуть, то ваш код нужно скорректировать вот так:
_, err := os.Stat(filename)
if err != nil {
if os.IsNotExist(err) {
fmt.Println("file does not exist") // это_true
} else {
// другая ошибка (файл существует) - это_false
}
} else {
// тут данные функции os.Stat()
}
Собственно, у меня задача проверить наличие файла в папке...
Может быть есть функция специально для этого?
А то гугленье и советы_старших_товарищей всё про Stat(). Хотя она не для проверки наличия.
Ладно, я понял. Нюансы логики.
Тогда скорректируем вопрос: в роутинге, если видим на конце Пути_URL'а расширение_Х (например .css), то ищем этот_файл в данной_директории.
Вот как указать данную_директорию?
Вот это, что я описываю (сервер с выделенной функцией прямого открывания файлов по имени в URL'е): http.Handle("/", http.FileServer(http.Dir("directory")))
http.ListenAndServe(":80", nil)
равно вот этому (голый сервер, отдающий файлы также по URL'у): http.ListenAndServe(":80", http.FileServer(http.Dir("directory")))
Лично я бы никак это роутингом не назвал. :)
Не-не.., как отдать файл по решению роутера - это я знаю, это всё работает.
Вопрос в другом: отдать файл по URL'у ПРОСТО, мимо роутинга.
Сейчас есть логика: на все запросы запускается роутинг. (Но в роутинге нет "технической сопутки" - она не отдаёт подключенные файлы. Там чисто бизнес-логика.)
А надо: на все запросы напрямую отдаём файлы; а иначе - запускаем роутинг.
...Или так не бывает?..
Остался последний штрих. ))
[Для авто-запроса-открытия подключенных файлов.] Надо, в имеющийся код-роутинг вставить функцию, просто возвращающую файл, имя которого указано в конце Пути_URL'а. Типа функции http.Handle("/", http.FileServer(http.Dir("directory"))).
В main() эту функцию мне не даёт вставить, ибо там уже есть слушатель_всех_запросов:
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
parsingURL(w, r) // Это мой роутинг.
})
А при вставке в функцию parsingURL() - где маршрутизация моя - компилируется, но страницы вообще не открываются, и в консоли ругань.
Может быть что-то подскажете? :)
А почему структуру надо передавать как указатель?
Как не_указатель её не передать? Понятно, что ЯП не позволит как не_указатель, но вот и интересно - в чём смысл указателя тут?
Ну понятно. Уже подумал про это.
Тут вопрос больше не в том, что юзер видит некий_файл, а в том, что любой может взять с моего сервере какой-то файл (пусть и не совсем любой).
Александр, а как-то защищается запрос подключенных файлов? То есть браузер запрашивает CSS (для "ведущей" уже загруженной HTML-страницы): /domen.com/style.css ; тогда как основной_URL (по которому ведущая HTML-страница): /domen/index.html. В каком месте отличие?
Так любой наберёт URL_с_CSS, и получит мой CSS, что ли?
Не могу нагуглить.
Все остальное тоже верно.