File Paths

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