如何在 Go 中检测文件夹中的隐藏文件 - 跨平台方法
How to detect Hidden Files in a folder in Go - cross-platform approach
我正在通过 golang 中的 filePath.Walk 方法遍历已安装的文件夹,但它也 returns 隐藏文件。我必须跳过那些隐藏文件。
对于 MaxOS 和 Linux,我们可以通过文件名中的 .
前缀来检测隐藏文件,但是对于 windows,当我尝试使用这种方法时 [=13] =],由 "syscall"
提供,它不会检测这些方法并引发错误。
使用以下方法获取文件
err := filepath.Walk(prefix, func(docPath string, f os.FileInfo, err error) error {
下面是我尝试检测隐藏文件的方法
import (
"runtime"
"syscall"
)
func IsHiddenFile(filename string) (bool, error) {
if runtime.GOOS == "windows" {
pointer, err := syscall.UTF16PtrFromString(filename)
if err != nil {
return false, err
}
attributes, err := syscall.GetFileAttributes(pointer)
if err != nil {
return false, err
}
return attributes&syscall.FILE_ATTRIBUTE_HIDDEN != 0, nil
} else {
// unix/linux file or directory that starts with . is hidden
if filename[0:1] == "." {
return true, nil
}
}
return false, nil
}
错误:
.../ undefined: syscall.UTF16PtrFromString
.../ undefined: syscall.GetFileAttributes
.../ undefined: syscall.FILE_ATTRIBUTE_HIDDEN
我按照此处的建议在文件开头的包名称之前添加了此 // +build windows
:syscall variables undefined 但它仍然无法正常工作并抛出相同的错误。
我想知道go是否提供了一些常用的方法来检测文件是否被隐藏?或者有没有一种方法可以在不首先接收隐藏文件的情况下获取某个安装目录中的所有 files/folder?
非常期待在这里收到一些反馈,谢谢。
编辑:修复了上面提到的问题(请参考下面的评论),我也想知道当我们连接到远程服务器(SMB)时如何检测隐藏文件,远程系统可能是运行 任何 OS,我们根据它 运行 所在的系统编译这些方法。在那种情况下我们如何检测隐藏文件?
条件编译是正确的方法,但它适用于源文件级别,因此您需要两个单独的文件。
例如:
hidden_notwin.go:
// +build !windows
package main
func IsHiddenFile(filename string) (bool, error) {
return filename[0:1] == ".", nil
}
hidden_windows.go:
// +build windows
package main
import (
"syscall"
)
func IsHiddenFile(filename string) (bool, error) {
pointer, err := syscall.UTF16PtrFromString(filename)
if err != nil {
return false, err
}
attributes, err := syscall.GetFileAttributes(pointer)
if err != nil {
return false, err
}
return attributes&syscall.FILE_ATTRIBUTE_HIDDEN != 0, nil
}
请注意,上面的 // +build windows
标记是可选的 - _windows
源文件后缀已经发挥了作用。有关详细信息,请参阅 How to use conditional compilation with the go build tool。
我正在通过 golang 中的 filePath.Walk 方法遍历已安装的文件夹,但它也 returns 隐藏文件。我必须跳过那些隐藏文件。
对于 MaxOS 和 Linux,我们可以通过文件名中的 .
前缀来检测隐藏文件,但是对于 windows,当我尝试使用这种方法时 [=13] =],由 "syscall"
提供,它不会检测这些方法并引发错误。
使用以下方法获取文件
err := filepath.Walk(prefix, func(docPath string, f os.FileInfo, err error) error {
下面是我尝试检测隐藏文件的方法
import (
"runtime"
"syscall"
)
func IsHiddenFile(filename string) (bool, error) {
if runtime.GOOS == "windows" {
pointer, err := syscall.UTF16PtrFromString(filename)
if err != nil {
return false, err
}
attributes, err := syscall.GetFileAttributes(pointer)
if err != nil {
return false, err
}
return attributes&syscall.FILE_ATTRIBUTE_HIDDEN != 0, nil
} else {
// unix/linux file or directory that starts with . is hidden
if filename[0:1] == "." {
return true, nil
}
}
return false, nil
}
错误:
.../ undefined: syscall.UTF16PtrFromString
.../ undefined: syscall.GetFileAttributes
.../ undefined: syscall.FILE_ATTRIBUTE_HIDDEN
我按照此处的建议在文件开头的包名称之前添加了此 // +build windows
:syscall variables undefined 但它仍然无法正常工作并抛出相同的错误。
我想知道go是否提供了一些常用的方法来检测文件是否被隐藏?或者有没有一种方法可以在不首先接收隐藏文件的情况下获取某个安装目录中的所有 files/folder?
非常期待在这里收到一些反馈,谢谢。
编辑:修复了上面提到的问题(请参考下面的评论),我也想知道当我们连接到远程服务器(SMB)时如何检测隐藏文件,远程系统可能是运行 任何 OS,我们根据它 运行 所在的系统编译这些方法。在那种情况下我们如何检测隐藏文件?
条件编译是正确的方法,但它适用于源文件级别,因此您需要两个单独的文件。
例如:
hidden_notwin.go:
// +build !windows
package main
func IsHiddenFile(filename string) (bool, error) {
return filename[0:1] == ".", nil
}
hidden_windows.go:
// +build windows
package main
import (
"syscall"
)
func IsHiddenFile(filename string) (bool, error) {
pointer, err := syscall.UTF16PtrFromString(filename)
if err != nil {
return false, err
}
attributes, err := syscall.GetFileAttributes(pointer)
if err != nil {
return false, err
}
return attributes&syscall.FILE_ATTRIBUTE_HIDDEN != 0, nil
}
请注意,上面的 // +build windows
标记是可选的 - _windows
源文件后缀已经发挥了作用。有关详细信息,请参阅 How to use conditional compilation with the go build tool。