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

3

我正在使用Go语言中的filePath.Walk方法遍历一个已挂载的文件夹,但它也会返回隐藏文件。我需要跳过这些隐藏文件。

对于MaxOS和Linux,我们可以通过文件名前缀为.来检测隐藏文件,但是对于Windows,当我尝试使用"syscall"提供的GetFileAttributes方法时,它无法检测到这些方法并抛出错误。

使用以下方法获取文件:

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,如此建议,但仍然无法正常工作并抛出相同的错误。

我需要知道go是否提供了一些通用方法来检测文件是否隐藏?或者是否有一种方法可以在首先不接收隐藏文件的情况下获取某个挂载目录中的所有文件/文件夹?

真的很期待在这里获得一些反馈,谢谢。


编辑:已解决上述问题(请参见下面的评论),我还想知道当我们连接到远程服务器(SMB)时,如何检测隐藏文件,远程系统可以运行任何操作系统,并且我们根据其运行的系统编译这些方法。在这种情况下,如何检测隐藏文件?

1个回答

8

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

例如:

hidden_notwin.go:

//go:build !windows

package main

func IsHiddenFile(filename string) (bool, error) {
    return filename[0] == '.', nil
}

hidden_windows.go:

//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
}

请注意,上面的//go:build windows标记是可选的 - _windows源文件后缀已经实现了该功能。有关更多详细信息,请参见go命令 - 构建约束

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接