1
0
mirror of https://github.com/ManyakRus/starter.git synced 2025-11-23 22:45:11 +02:00
Files
starter/folders/folders.go
2024-10-22 15:00:07 +03:00

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
}