gpt4 book ai didi

windows - 如何在 Go 中检测文件夹中的隐藏文件 - 跨平台方法

转载 作者:行者123 更新时间:2023-12-05 01:55:18 30 4
gpt4 key购买 nike

我正在通过 golang 中的 filePath.Walk 方法遍历已安装的文件夹,但它也返回隐藏文件。我必须跳过那些隐藏文件。对于 MaxOS 和 Linux,我们可以通过 . 文件名中的前缀来检测隐藏文件,但是对于 Windows,当我尝试使用此方法时 GetFileAttributes,由 “系统调用”,它不会检测这些方法并抛出错误。

使用下面的方法获取文件

err := filepath.Walk(prefix, func(docPath string, f os.FileInfo, err 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 是否提供了一些常用的方法来检测文件是否被隐藏?或者有没有一种方法可以在不首先接收隐藏文件的情况下获取某个已安装目录中的所有文件/文件夹?

非常期待在这里收到一些反馈,谢谢。


编辑:修复了上面提到的问题(请引用下面的评论),我也想知道当我们连接到远程服务器(SMB)时如何检测隐藏文件,远程系统可以运行任何操作系统,我们根据运行的系统编译这些方法。在这种情况下,我们如何检测隐藏文件?

最佳答案

条件编译是正确的方式,但它适用于源文件级别,因此您需要两个单独的文件。

例如:

hidden_​​notwin.go:

// +build !windows

package main

func IsHiddenFile(filename string) (bool, error) {
return filename[0] == '.', 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 .

关于windows - 如何在 Go 中检测文件夹中的隐藏文件 - 跨平台方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70291933/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com