path/filepath paketi
Fayl yo'llari (papka/ichki/fayl.txt kabi) bilan qo'lda, oddiy satr sifatida ishlash xavfli — chunki Windows'da yo'l ajratuvchi belgi \ (teskari qiya chiziq), Linux/macOS'da esa / bo'ladi. path/filepath paketi shu farqni avtomatik hisobga olib, fayl yo'llarini xavfsiz va operatsion tizimga mos tarzda qurish, tahlil qilish imkonini beradi.
import "path/filepath"
Join()package main
import (
"fmt"
"path/filepath"
)
func main() {
// operatsion tizimga mos ajratuvchi bilan birlashtiradi
p := filepath.Join("papka", "ichki", "fayl.txt")
fmt.Println(p)
}
Natija (Linux/macOS'da):
papka/ichki/fayl.txt
[!IMPORTANT] Fayl yo'lini hech qachon
"papka" + "/" + "fayl.txt"kabi qo'lda birlashtirmang!filepath.Join()operatsion tizimga mos ajratuvchini o'zi tanlaydi (Windows'da bu kod avtomatikpapka\fayl.txtberadi) va ortiqcha qiyshiq chiziqlarni ham tozalab beradi.
Base() va Dir()package main
import (
"fmt"
"path/filepath"
)
func main() {
path := "/uy/foydalanuvchi/hujjat.pdf"
fmt.Println(filepath.Base(path)) // faqat fayl nomi
fmt.Println(filepath.Dir(path)) // faqat papka yo'li
}
Natija:
hujjat.pdf
/uy/foydalanuvchi
Ext()package main
import (
"fmt"
"path/filepath"
)
func main() {
fmt.Println(filepath.Ext("hujjat.pdf"))
fmt.Println(filepath.Ext("rasm.jpeg"))
fmt.Println(filepath.Ext("README"))
}
Natija:
.pdf
.jpeg
Agar faylda kengaytma bo'lmasa (masalan, README), Ext() bo'sh satr qaytaradi.
Abs()package main
import (
"fmt"
"path/filepath"
)
func main() {
// "fayl.txt" — joriy papkaga nisbatan yozilgan nisbiy yo'l
abs, err := filepath.Abs("fayl.txt")
fmt.Println(abs)
fmt.Println(err)
}
Natija (dastur qaysi papkadan ishga tushirilganiga qarab boshqacha bo'ladi):
/uy/loyiha/fayl.txt
<nil>
Yo'l allaqachon to'liq (absolyut) yoki nisbiy ekanligini tekshirish uchun IsAbs() ishlatiladi:
fmt.Println(filepath.IsAbs("/uy/fayl.txt")) // true
fmt.Println(filepath.IsAbs("fayl.txt")) // false
Natija:
true
false
Clean()Agar yo'l ichida ortiqcha qiyshiq chiziqlar yoki .. (bir papka yuqoriga chiqish) kabi belgilar bo'lsa, Clean() ularni soddalashtiradi:
package main
import (
"fmt"
"path/filepath"
)
func main() {
clean := filepath.Clean("papka//ichki/../fayl.txt")
fmt.Println(clean)
}
Natija:
papka/fayl.txt
ichki/.. — "ichki papkaga kirib, keyin undan chiqish" degani, natijada bu ikkisi bir-birini bekor qiladi va sodda papka/fayl.txt qoladi.
Glob() va Match()package main
import (
"fmt"
"path/filepath"
)
func main() {
// joriy papkadagi barcha .go fayllarini topadi
entries, err := filepath.Glob("*.go")
fmt.Println(entries, err)
// bitta nomni patternga mosligini tekshiradi (fayl tizimiga murojaat qilmasdan)
match, _ := filepath.Match("*.txt", "hujjat.txt")
fmt.Println(match)
}
Natija (joriy papkadagi fayllarga qarab farq qiladi):
[main.go] <nil>
true
| Vazifa | Funksiya |
|---|---|
| Yo'l qismlarini xavfsiz birlashtirish | filepath.Join() |
| Fayl nomini / papka yo'lini ajratish | filepath.Base() / Dir() |
| Fayl kengaytmasini olish | filepath.Ext() |
| Nisbiy yo'lni to'liq yo'lga aylantirish | filepath.Abs() |
| Yo'l to'liq (absolyut) ekanligini tekshirish | filepath.IsAbs() |
| Ortiqcha belgilardan tozalash | filepath.Clean() |
| Patternga mos fayllarni qidirish | filepath.Glob() |
[!NOTE] Agar URL manzillari (
/blog/2025/maqolakabi) bilan ishlayotgan bo'lsangiz,path/filepathemas, oddiypathpaketidan foydalaning — u har doim/belgisidan foydalanadi va operatsion tizimga bog'liq emas (URL'lar hamma joyda/bilan yoziladi, operatsion tizimdan qat'i nazar).