Skip to content

Commit 922432a

Browse files
committed
Add xdg.DataFile() and xdg.SearchDataFile() example
1 parent 6d578cb commit 922432a

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package xdgspec
2+
3+
import (
4+
"github.com/adrg/xdg"
5+
"github.com/devlights/try-golang/lib/output"
6+
"io/ioutil"
7+
"os"
8+
"path/filepath"
9+
"runtime"
10+
)
11+
12+
// XdgFileOperation は、[xdg](https://github.com/adrg/xdg) を利用して
13+
// XDGの規定に従った場所にファイルを配置したり検索したりしています.
14+
func XdgFileOperation() error {
15+
var (
16+
dataDir = filepath.Join(xdg.DataHome, "try-golang")
17+
)
18+
19+
output.Stdoutl("[OS]", runtime.GOOS)
20+
output.Stdoutl("[dataDir]", dataDir)
21+
22+
// 処理する前に既にファイルが存在してたら消す
23+
if _, err := os.Stat(dataDir); err == nil {
24+
output.Stdoutl("[exists?]", "存在する --> 削除")
25+
26+
if err = os.RemoveAll(dataDir); err != nil {
27+
output.Stderrl("[os.Remove]", err)
28+
return err
29+
}
30+
} else {
31+
output.Stdoutl("[exists?]", "存在しない")
32+
}
33+
34+
// xdg.DataFile() に アプリ名/ファイル名 で渡すとXDGの規定に従ったパスを
35+
// 生成して返してくれる. xdg.DataFile() にすると $XDG_DATA_HOME
36+
// xdg.ConfigFile() にすると $XDG_CONFIG_HOME がベースとなる
37+
//
38+
// このとき、ファイルの親ディレクトリ(つまりアプリ名の部分)が
39+
// 存在しない場合は、ディレクトリを作成してくれる
40+
dataFile, err := xdg.DataFile("try-golang/mydata.txt")
41+
if err != nil {
42+
output.Stderrl("[xdg.DataFile]", err)
43+
return err
44+
}
45+
46+
output.Stdoutl("[xdg.DataFile]", dataFile)
47+
48+
if _, err = os.Stat(dataDir); err == nil {
49+
output.Stdoutl("[exists?]", "存在する")
50+
} else {
51+
output.Stdoutl("[exists?]", "存在しない")
52+
}
53+
54+
if err = ioutil.WriteFile(dataFile, []byte("helloworld\n"), 0644); err != nil {
55+
output.Stderrl("[ioutil.WriteFile]", err)
56+
return err
57+
}
58+
59+
if bytes, err := ioutil.ReadFile(dataFile); err == nil {
60+
output.Stdoutl("[ioutil.ReadFile]", string(bytes))
61+
}
62+
63+
// xdg.SearchDataFile() を利用すると、指定した アプリ名/ファイル名 を探してくれる.
64+
// 存在しない場合は、err に値が入る.
65+
// xdg.DataFile() と違い、こちらは親ディレクトリを作ったりはしてくれない.
66+
// 既にファイルが存在する場合に利用する.
67+
dataFile2, err := xdg.SearchDataFile("try-golang/mydata.txt")
68+
if err != nil {
69+
output.Stderrl("[xdg.SearchDataFile]", err)
70+
return err
71+
}
72+
73+
output.Stdoutl("[xdg.SearchDataFile]", dataFile2)
74+
75+
// 後始末
76+
_ = os.RemoveAll(dataDir)
77+
78+
return nil
79+
}

lib/mapping.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ func (m SampleMapping) MakeMapping() {
146146
m["generate_generic_queue"] = generate.UseGenericQueue
147147
m["xdg_base_directory"] = xdgspec.XdgBaseDirectory
148148
m["xdg_user_directory"] = xdgspec.XdgUserDirectory
149+
m["xdg_file_operation"] = xdgspec.XdgFileOperation
149150

150151
m["tutorial_gotour_helloworld"] = tutorial.HelloWorld
151152
m["tutorial_gotour_import"] = tutorial.Import

0 commit comments

Comments
 (0)