mirror of
https://github.com/ManyakRus/starter.git
synced 2025-11-26 23:10:42 +02:00
118 lines
2.2 KiB
Go
118 lines
2.2 KiB
Go
package folders
|
|
|
|
import (
|
|
"encoding/json"
|
|
"log"
|
|
"os"
|
|
"path"
|
|
"path/filepath"
|
|
)
|
|
|
|
type File struct {
|
|
Name string
|
|
}
|
|
|
|
type Folder struct {
|
|
FileName string
|
|
Name string
|
|
Files []*File
|
|
Folders map[string]*Folder
|
|
}
|
|
|
|
func (f *Folder) String() string {
|
|
j, _ := json.Marshal(f)
|
|
return string(j)
|
|
}
|
|
|
|
// FindFoldersTree - возвращает дерево каталогов и файлов, начиная с директории dir
|
|
func FindFoldersTree(dir string, NeedFolders, NeedFiles, NeedDot bool, MassExclude []string) *Folder {
|
|
dir = path.Clean(dir)
|
|
var tree *Folder
|
|
var nodes = map[string]interface{}{}
|
|
var walkFun filepath.WalkFunc = func(p string, info os.FileInfo, err error) error {
|
|
if info == nil {
|
|
return nil
|
|
}
|
|
|
|
// проверка кроме MassExclude
|
|
if len(MassExclude) > 0 {
|
|
for _, v := range MassExclude {
|
|
if info.Name() == v {
|
|
continue
|
|
}
|
|
if p == v {
|
|
continue
|
|
}
|
|
}
|
|
}
|
|
|
|
if info.IsDir() {
|
|
nodes[p] = &Folder{p, path.Base(p), []*File{}, map[string]*Folder{}}
|
|
} else {
|
|
nodes[p] = &File{path.Base(p)}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
err := filepath.Walk(dir, walkFun)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
for key, value := range nodes {
|
|
var parentFolder *Folder
|
|
if key == dir {
|
|
tree = value.(*Folder)
|
|
continue
|
|
} else {
|
|
parentFolder = nodes[path.Dir(key)].(*Folder)
|
|
}
|
|
|
|
// найдём название Папки/Файла
|
|
var Name string
|
|
//var FolderName string
|
|
switch value.(type) {
|
|
case *File:
|
|
Name = value.(*File).Name
|
|
case *Folder:
|
|
{
|
|
Name = value.(*Folder).Name
|
|
//FolderName = value.(*Folder).FileName
|
|
}
|
|
}
|
|
|
|
// проверка скрытые файлы с точкой
|
|
if NeedDot == false && len(Name) > 0 && Name[0:1] == "." {
|
|
continue
|
|
}
|
|
|
|
//// проверка кроме MassExclude
|
|
//if len(MassExclude) > 0 {
|
|
// for _, v := range MassExclude {
|
|
// if Name == v {
|
|
// continue
|
|
// }
|
|
// if FolderName == v {
|
|
// continue
|
|
// }
|
|
// }
|
|
//}
|
|
|
|
//
|
|
switch v := value.(type) {
|
|
case *File:
|
|
if NeedFiles == false {
|
|
break
|
|
}
|
|
parentFolder.Files = append(parentFolder.Files, v)
|
|
case *Folder:
|
|
if NeedFolders == false {
|
|
break
|
|
}
|
|
parentFolder.Folders[v.Name] = v
|
|
}
|
|
}
|
|
|
|
return tree
|
|
}
|