mirror of
https://github.com/ManyakRus/starter.git
synced 2025-11-23 22:45:11 +02:00
153 lines
3.0 KiB
Go
153 lines
3.0 KiB
Go
package folders
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"path"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
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 {
|
|
return nil
|
|
}
|
|
if p == v {
|
|
return nil
|
|
}
|
|
}
|
|
}
|
|
|
|
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 {
|
|
var ok bool
|
|
parentFolder, ok = nodes[path.Dir(key)].(*Folder)
|
|
if !ok {
|
|
continue
|
|
}
|
|
}
|
|
|
|
// найдём название Папки/Файла
|
|
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 && strings.HasPrefix(Name, ".") {
|
|
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
|
|
}
|
|
|
|
// FindFiles_FromDirectory - возвращает список файлов, начиная в директории dir, с суффиксом(расширение файла) Suffix
|
|
func FindFiles_FromDirectory(dir string, Suffix string) ([]string, error) {
|
|
var Otvet []string
|
|
var err error
|
|
|
|
files, err := os.ReadDir(dir)
|
|
if err != nil {
|
|
err = fmt.Errorf("ReadDir() error: %w", err)
|
|
return Otvet, err
|
|
}
|
|
|
|
for _, file := range files {
|
|
if file.IsDir() {
|
|
continue
|
|
}
|
|
Filename := file.Name()
|
|
|
|
if Suffix != "" {
|
|
if strings.HasSuffix(Filename, Suffix) == false {
|
|
continue
|
|
}
|
|
}
|
|
FilenameFull := path.Join(dir, Filename)
|
|
Otvet = append(Otvet, FilenameFull)
|
|
}
|
|
|
|
return Otvet, err
|
|
}
|