59 / 68

path/filepath

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.

example.go
import "path/filepath"

1. Yo'l qismlarini birlashtirish: Join()

example.go
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):

kod
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 avtomatik papka\fayl.txt beradi) va ortiqcha qiyshiq chiziqlarni ham tozalab beradi.


2. Fayl nomi va papka yo'lini ajratish: Base() va Dir()

example.go
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:

kod
hujjat.pdf
/uy/foydalanuvchi

3. Fayl kengaytmasini olish: Ext()

example.go
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:

kod
.pdf
.jpeg

Agar faylda kengaytma bo'lmasa (masalan, README), Ext() bo'sh satr qaytaradi.


4. Nisbiy yo'lni to'liq (absolyut) yo'lga aylantirish: Abs()

example.go
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):

kod
/uy/loyiha/fayl.txt
<nil>

Yo'l allaqachon to'liq (absolyut) yoki nisbiy ekanligini tekshirish uchun IsAbs() ishlatiladi:

example.go
fmt.Println(filepath.IsAbs("/uy/fayl.txt")) // true
fmt.Println(filepath.IsAbs("fayl.txt"))     // false

Natija:

kod
true
false

5. Yo'lni "tozalash": Clean()

Agar yo'l ichida ortiqcha qiyshiq chiziqlar yoki .. (bir papka yuqoriga chiqish) kabi belgilar bo'lsa, Clean() ularni soddalashtiradi:

example.go
package main

import (
    "fmt"
    "path/filepath"
)

func main() {
    clean := filepath.Clean("papka//ichki/../fayl.txt")

    fmt.Println(clean)
}

Natija:

kod
papka/fayl.txt

ichki/.. — "ichki papkaga kirib, keyin undan chiqish" degani, natijada bu ikkisi bir-birini bekor qiladi va sodda papka/fayl.txt qoladi.


6. Patternga (pattern) mos fayllarni topish: Glob() va Match()

example.go
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):

kod
[main.go] <nil>
true

Xulosa: qachon qaysi funksiya kerak?

VazifaFunksiya
Yo'l qismlarini xavfsiz birlashtirishfilepath.Join()
Fayl nomini / papka yo'lini ajratishfilepath.Base() / Dir()
Fayl kengaytmasini olishfilepath.Ext()
Nisbiy yo'lni to'liq yo'lga aylantirishfilepath.Abs()
Yo'l to'liq (absolyut) ekanligini tekshirishfilepath.IsAbs()
Ortiqcha belgilardan tozalashfilepath.Clean()
Patternga mos fayllarni qidirishfilepath.Glob()

[!NOTE] Agar URL manzillari (/blog/2025/maqola kabi) bilan ishlayotgan bo'lsangiz, path/filepath emas, oddiy path paketidan foydalaning — u har doim / belgisidan foydalanadi va operatsion tizimga bog'liq emas (URL'lar hamma joyda / bilan yoziladi, operatsion tizimdan qat'i nazar).