-
Notifications
You must be signed in to change notification settings - Fork 0
/
organiser.go
160 lines (136 loc) · 3.17 KB
/
organiser.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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
package main
import (
"fmt"
"io"
"log"
"os"
"path/filepath"
"strings"
"fyne.io/fyne"
"fyne.io/fyne/dialog"
"fyne.io/fyne/widget"
)
const detaultDateFormat = "2006-01-02"
func organise(inputFolder, outputFolder, copyOrMove string, w *fyne.Window, p *widget.ProgressBar) error {
var (
count int
acceptedSuffixes = []string{"jpeg", "jpg", "png", "gif", "raw", "svg", "heif", "heic", "bmp", "MP4"}
)
_, f, err := folderCheck(inputFolder)
if err != nil {
log.Printf("ERROR: %s", err)
return err
}
outputFolder = f + "/output"
fmt.Printf("Let's start! Input folder: %s Output folder %s \n", inputFolder, outputFolder)
os.RemoveAll(outputFolder)
err = filepath.Walk(inputFolder,
func(path string, file os.FileInfo, err error) error {
if err != nil {
return err
}
count++
name := file.Name()
if !isExtensionAccepted(name, acceptedSuffixes) {
return nil
}
date := file.ModTime().Format(detaultDateFormat)
year := file.ModTime().Year()
newFolder := fmt.Sprintf("%s/%d/%s", outputFolder, year, date)
fmt.Printf("Action: %s, File: %s, Folder: %s \n", copyOrMove, name, newFolder)
err = os.MkdirAll(newFolder, 0755)
if err != nil {
log.Printf("ERROR: %s", err)
return nil
}
if copyOrMove == "copy" {
err := Copy(path, newFolder+"/"+name)
if err != nil {
log.Printf("ERROR: %s", err)
return nil
}
} else {
err := Move(path, newFolder+"/"+name)
if err != nil {
log.Printf("ERROR: %s", err)
return nil
}
}
v := setBarValue(count)
if p != nil {
p.SetValue(v)
}
return nil
})
if err != nil {
log.Printf("ERROR: %s", err)
return nil
}
if p != nil {
p.SetValue(1)
}
successMessage := fmt.Sprintf("Managed to %s %d files", copyOrMove, count)
if w != nil {
dialog.ShowInformation("Done!", successMessage, *w)
}
fmt.Printf("Action: %s, number of files: %d \n", copyOrMove, count)
return nil
}
func isExtensionAccepted(filename string, suffixes []string) bool {
for _, s := range suffixes {
if strings.HasSuffix("."+strings.ToLower(filename), s) {
return true
}
}
return false
}
// Copy is for copying files
func Copy(src, dst string) error {
in, err := os.Open(src)
if err != nil {
return err
}
defer in.Close()
out, err := os.Create(dst)
if err != nil {
return err
}
defer out.Close()
_, err = io.Copy(out, in)
if err != nil {
return err
}
return out.Close()
}
// Move is for moving files
func Move(src, dst string) error {
in, err := os.Open(src)
if err != nil {
return err
}
defer in.Close()
err = os.Rename(src, dst)
if err != nil {
log.Fatal(err)
}
return in.Close()
}
func folderCheck(f string) (os.FileInfo, string, error) {
folderInfo, err := os.Stat(f)
if os.IsNotExist(err) {
log.Fatal("Folder does not exist.")
return nil, f, err
}
// if it's not a folder, then it's a file and we get the folder that contains it
if !folderInfo.IsDir() {
pathList := strings.Split(f, "/")
f = strings.Join(pathList[:len(pathList)-1], "/")
folderInfo, err = os.Stat(f)
if os.IsNotExist(err) {
log.Fatal("Folder does not exist.")
return nil, f, err
}
}
log.Println(folderInfo)
return folderInfo, f, nil
}