diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..45784b0 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.qodo diff --git a/go.mod b/go.mod index 6d366f7..fca369b 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module binarysusser go 1.24.1 + +require github.com/bmatcuk/doublestar/v4 v4.8.1 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..7faa1ee --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/bmatcuk/doublestar/v4 v4.8.1 h1:54Bopc5c2cAvhLRAzqOGCYHYyhcDHsFF4wWIR5wKP38= +github.com/bmatcuk/doublestar/v4 v4.8.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= diff --git a/main.go b/main.go index d463aca..e2e0cc8 100644 --- a/main.go +++ b/main.go @@ -9,8 +9,8 @@ import ( "sort" "strings" "sync" - "sync/atomic" - "time" + + "github.com/bmatcuk/doublestar/v4" ) var Error *log.Logger @@ -50,15 +50,14 @@ func main() { log.Printf("Scanning directory: %s", dir) } - files := make(chan string, 10000) - status := make(chan error) - go GetSyncFilesRecursively(dir, files, status) - //files <- "SmarterConstruction.pdb" + files, err := doublestar.Glob(os.DirFS(dir), "**/*") + if err != nil { + log.Fatalf("Error globbing directory: %v", err) + } extensionTypeCount := sync.Map{} - wg := sync.WaitGroup{} - for file := range files { + for _, file := range files { wg.Add(1) go func(file string) { defer wg.Done() @@ -320,82 +319,6 @@ func IsStringBinary(s string) bool { return false } -func GetSyncFilesRecursively(input string, output chan string, status chan error) { - defer close(output) - defer close(status) - - var filesProcessed int32 - var foldersProcessed int32 - var activeWorkers int32 - - done := make(chan struct{}) - defer close(done) - - directories := make(chan string, 100000) - workerPool := make(chan struct{}, 4000) - directories <- input - - allDone := make(chan struct{}) - - go func() { - var wg sync.WaitGroup - - go func() { - for { - if atomic.LoadInt32(&activeWorkers) == 0 && len(directories) == 0 { - time.Sleep(10 * time.Millisecond) - if atomic.LoadInt32(&activeWorkers) == 0 && len(directories) == 0 { - close(allDone) - return - } - } - time.Sleep(50 * time.Millisecond) - } - }() - - for { - select { - case directory, ok := <-directories: - if !ok { - wg.Wait() - return - } - - atomic.AddInt32(&activeWorkers, 1) - - go func(dir string) { - workerPool <- struct{}{} - - atomic.AddInt32(&foldersProcessed, 1) - processDirectory(dir, directories, output, &filesProcessed) - - <-workerPool - atomic.AddInt32(&activeWorkers, -1) - }(directory) - } - } - }() - - <-allDone -} - -func processDirectory(directory string, directories chan<- string, output chan<- string, filesProcessed *int32) { - files, err := os.ReadDir(directory) - if err != nil { - //log.Printf("Error reading directory %s: %+v", directory, err) - return - } - - for _, file := range files { - if file.IsDir() { - directories <- filepath.Join(directory, file.Name()) - } else { - output <- filepath.Join(directory, file.Name()) - atomic.AddInt32(filesProcessed, 1) - } - } -} - func NormalizePath(input string) string { input = filepath.Clean(input) input = filepath.ToSlash(input)