filepath.Ext не работает в termux
filepath.Ext() Использование этой функции срабатывает при использовании на ПК на любой ос, но выдает пустоту когда пытаюсь получить расширение файла в термуксе на андроид. В чем проблема может быть и какие ещё данные нужны для понимания? Код может быть любой, хоть
log.Println(filepath.Ext(path))
в main.
Файл всегда один и тот же(я беру файл main.go моего проекта).
Может есть другой способ который даёт расширение всегда в любой ос.
UPD:
Проблема не в filepath.Ext а в mime.TypeByExtention. Именно эта функция дает путоту. filepath.Ext работает корректно
Посмотрел исходники как вообще реализовано определениие типа по расширению там это реализовано в виде мапы:
var builtinTypesLower = map[string]string{
".avif": "image/avif",
".css": "text/css; charset=utf-8",
".gif": "image/gif",
".htm": "text/html; charset=utf-8",
".html": "text/html; charset=utf-8",
".jpeg": "image/jpeg",
".jpg": "image/jpeg",
".js": "text/javascript; charset=utf-8",
".json": "application/json",
".mjs": "text/javascript; charset=utf-8",
".pdf": "application/pdf",
".png": "image/png",
".svg": "image/svg+xml",
".wasm": "application/wasm",
".webp": "image/webp",
".xml": "text/xml; charset=utf-8",
}
...и мне стало интреесно, а как же собственно, на остальных операционках определеяется тип данных файла, если в мапе исходников .go нет вовсе... Откуда mime.TypeByExtention берет text/x-go если такого расширения как .go нет в мапе в исходниках
UPD: не разобрался откуда typebyextension из пакета mime берет text/x-go для .go файлов. Оказалось что не обязательно для текстовых файлов указывать точный тип. Для текстовых файлов достаточно указать text/plain и они почти везде будут обрабатываться нормально. Поэтому для определения типа использую DetectContentType из пакета http. Gemini говорит что typebyExtension из пакета mime это алиас над detectContentType из net/http.
Для моего кейса, определять тип с помощью http.DetectContentType() оказалось достуточно.
Ответы (1 шт):
Жаль что вы не привели минимально воспроизводимый пример. Из вашего примера совершенно неясно,откуда вы берёте path
Предположим, вы берёте его из os.Args
. Но по какой-то неясной причине в Термуксе массив os.Args
заполнен очень странно
package main
import (
"log"
"os"
"path/filepath"
"strings"
)
func main() {
log.Println(strings.Join(os.Args, " "))
if len(os.Args) == 1 {
log.Fatal("missing argument")
}
path, err := filepath.Abs(os.Args[1])
if err != nil {
log.Fatal("failed to get absolute path", "path", os.Args[1], "error", err.Error())
}
log.Println(path)
log.Println(filepath.Ext(path))
}
Программа выводит
~/zzz $ go build .
~/zzz $ ./zzz main.go
2024/11/03 18:33:47 ./zzz /data/data/com.termux/files/home/zzz/zzz main.go
2024/11/03 18:33:47 /data/data/com.termux/files/home/zzz/zzz
2024/11/03 18:33:47
В первой строчке напечатан массив os.Args
:
os.Args[0] == ./zzz
os.Args[1] == /data/data/com.termux/files/home/zzz/zzz
os.Args[2] == main.go
Если брать file.Ext(os.Args[1])
,то результат действительно будет пустой строкой. Но если выполнить file.Ext(os.Args[2])
, то вернёт, как полагается, .go
.