diff --git a/drivers/local/driver.go b/drivers/local/driver.go index 3675b8aa..6c85f47f 100644 --- a/drivers/local/driver.go +++ b/drivers/local/driver.go @@ -128,11 +128,9 @@ func (d *Local) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([ } var files []model.Obj for _, f := range rawFiles { - if !d.ShowHidden && strings.HasPrefix(f.Name(), ".") { - continue + if d.ShowHidden || !isHidden(f, fullPath) { + files = append(files, d.FileInfoToObj(ctx, f, args.ReqPath, fullPath)) } - file := d.FileInfoToObj(ctx, f, args.ReqPath, fullPath) - files = append(files, file) } return files, nil } diff --git a/drivers/local/util_unix.go b/drivers/local/util_unix.go new file mode 100644 index 00000000..ddb4879f --- /dev/null +++ b/drivers/local/util_unix.go @@ -0,0 +1,12 @@ +//go:build !windows + +package local + +import ( + "io/fs" + "strings" +) + +func isHidden(f fs.FileInfo, _ string) bool { + return strings.HasPrefix(f.Name(), ".") +} diff --git a/drivers/local/util_windows.go b/drivers/local/util_windows.go new file mode 100644 index 00000000..8df191cb --- /dev/null +++ b/drivers/local/util_windows.go @@ -0,0 +1,22 @@ +//go:build windows + +package local + +import ( + "io/fs" + "path/filepath" + "syscall" +) + +func isHidden(f fs.FileInfo, fullPath string) bool { + filePath := filepath.Join(fullPath, f.Name()) + namePtr, err := syscall.UTF16PtrFromString(filePath) + if err != nil { + return false + } + attrs, err := syscall.GetFileAttributes(namePtr) + if err != nil { + return false + } + return attrs&syscall.FILE_ATTRIBUTE_HIDDEN != 0 +}