-
Notifications
You must be signed in to change notification settings - Fork 9
/
ioFS.go
100 lines (85 loc) · 1.61 KB
/
ioFS.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package main
import (
"embed"
"fmt"
"io/fs"
"os"
)
//go:embed static
var f embed.FS
var searchString string
func walkFunction(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
fmt.Printf("Path=%q, isDir=%v\n", path, d.IsDir())
return nil
}
func walkSearch(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
if d.Name() == searchString {
fileInfo, err := fs.Stat(f, path)
if err != nil {
return err
}
fmt.Println("Found", path, "with size", fileInfo.Size())
return nil
}
return nil
}
func list(f embed.FS) error {
return fs.WalkDir(f, ".", walkFunction)
}
func search(f embed.FS) error {
return fs.WalkDir(f, ".", walkSearch)
}
func extract(f embed.FS, filepath string) ([]byte, error) {
s, err := fs.ReadFile(f, filepath)
if err != nil {
return nil, err
}
return s, nil
}
func writeToFile(s []byte, path string) error {
fd, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return err
}
defer fd.Close()
n, err := fd.Write(s)
if err != nil {
return err
}
fmt.Printf("wrote %d bytes\n", n)
return nil
}
func main() {
// At this point we do not know what is included in ./static
// List all files
err := list(f)
if err != nil {
fmt.Println(err)
return
}
// Search
searchString = "file.txt"
err = search(f)
if err != nil {
fmt.Println(err)
return
}
// Extract into a byte slice
buffer, err := extract(f, "static/file.txt")
if err != nil {
fmt.Println(err)
return
}
// Save it to an actual file
writeToFile(buffer, "/tmp/IOFS.txt")
if err != nil {
fmt.Println(err)
return
}
}