File Paths
#
// `filepath` package သည် operating systems အကြား portable ဖြစ်သော
// နည်းလမ်းဖြင့် *file paths* များကို parse လုပ်ရန်နှင့် တည်ဆောက်ရန် functions များ
// ပေးပါသည်။ ဥပမာအားဖြင့် Linux တွင် `dir/file` နှင့် Windows တွင် `dir\file` ဖြစ်သည်။
package main
import (
"fmt"
"path/filepath"
"strings"
)
func main() {
// `Join` ကို portable နည်းလမ်းဖြင့် paths များ တည်ဆောက်ရန် အသုံးပြုသင့်သည်။
// ၎င်းသည် မည်သည့် arguments အရေအတွက်ကိုမဆို လက်ခံပြီး ၎င်းတို့မှ
// အဆင့်ဆင့် path တစ်ခု တည်ဆောက်ပေးသည်။
p := filepath.Join("dir1", "dir2", "filename")
fmt.Println("p:", p)
// `/`s သို့မဟုတ် `\`s များကို ကိုယ်တိုင် ပေါင်းစပ်ခြင်းအစား
// `Join` ကို အမြဲတမ်း အသုံးပြုသင့်သည်။ portable
// ဖြစ်စေခြင်းအပြင် `Join` သည် မလိုအပ်သော separators
// နှင့် directory ပြောင်းလဲမှုများကို ဖယ်ရှားခြင်းဖြင့် paths
// များကို ပုံမှန်ဖြစ်အောင် ပြုလုပ်ပေးပါသည်။
fmt.Println(filepath.Join("dir1//", "filename"))
fmt.Println(filepath.Join("dir1/../dir1", "filename"))
// `Dir` နှင့် `Base` ကို path တစ်ခုကို directory နှင့်
// file အဖြစ် ခွဲရန် အသုံးပြုနိုင်သည်။ တနည်းအားဖြင့်
// `Split` သည် နှစ်ခုလုံးကို တစ်ကြိမ်တည်းဖြင့် ပြန်ပေးပါသည်။
fmt.Println("Dir(p):", filepath.Dir(p))
fmt.Println("Base(p):", filepath.Base(p))
// path တစ်ခုသည် absolute ဖြစ်မဖြစ် စစ်ဆေးနိုင်သည်။
fmt.Println(filepath.IsAbs("dir/file"))
fmt.Println(filepath.IsAbs("/dir/file"))
filename := "config.json"
// အချို့ file အမည်များတွင် အစက်(dot .)နောက်တွင်
// extensions များ ပါရှိသည်။ ထိုကဲ့သို့သော
// အမည်များမှ extension ကို `Ext` ဖြင့် ခွဲထုတ်နိုင်သည်။
ext := filepath.Ext(filename)
fmt.Println(ext)
// extension ကို ဖယ်ထုတ်ထားသော file ၏အမည်ကို
// ရှာရန် `strings.TrimSuffix` ကို အသုံးပြုပါ။
fmt.Println(strings.TrimSuffix(filename, ext))
// `Rel` သည် *base* နှင့် *target* အကြား relative path
// ကို ရှာဖွေပေးသည်။ target ကို base နှင့် ဆက်စပ်၍ မရနိုင်ပါက error ကို ပြန်ပေးသည်။
rel, err := filepath.Rel("a/b", "a/b/t/file")
if err != nil {
panic(err)
}
fmt.Println(rel)
rel, err = filepath.Rel("a/b", "a/c/t/file")
if err != nil {
panic(err)
}
fmt.Println(rel)
}
$ go run file-paths.go
p: dir1/dir2/filename
dir1/filename
dir1/filename
Dir(p): dir1/dir2
Base(p): filename
false
true
.json
config
t/file
../c/t/file