为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Windows/Mac/Linux 中创建隐藏文件?

如何在 Windows/Mac/Linux 中创建隐藏文件?

Go
Helenr 2023-06-01 14:33:55
我构建了一个控制台应用程序,需要创建一些隐藏文件。我也知道以点开头的文件名将隐藏在 Linux 和 mac 中,但是 Windows?设置文件属性?有没有办法在 Windows / Linux / Mac 中创建隐藏文件和目录?
查看完整描述

4 回答

?
慕丝7291255

TA贡献1859条经验 获得超6个赞

视窗:

SetFileAttributesW 函数

设置文件或目录的属性。

FILE_ATTRIBUTE_HIDDEN    2 (0x2)

文件或目录被隐藏。它不包含在普通目录列表中。


去:

包系统调用

函数 SetFileAttributes

func SetFileAttributes(name *uint16, attrs uint32) (err error)

从 Go UTF-8 编码字符串 ( string) 转换为 Windows UTF-16 编码字符串指针 ( *uint16)。

包系统调用

函数 UTF16PtrFromString

func UTF16PtrFromString(s string) (*uint16, error)

UTF16PtrFromString 返回指向 UTF-8 字符串 s 的 UTF-16 编码的指针,并添加了终止 NUL。如果 s 在任何位置包含 NUL 字节,则返回 (nil, EINVAL)。


使用操作系统构建约束。


例如,

hide/attrib.go:

package main


import (

    "fmt"

    "io/ioutil"

    "os"

)


func main() {

    filename := `test.hidden.file`

    os.Remove(filename)

    os.Remove("." + filename)

    err := ioutil.WriteFile(filename, []byte(filename), 0666)

    if err != nil {

        fmt.Fprintln(os.Stderr, err)

        return

    }

    err = HideFile(filename)

    if err != nil {

        fmt.Fprintln(os.Stderr, err)

        return

    }

    fmt.Println("hidden:", filename)

}

hide/hide.go:


// +build !windows


package main


import (

    "os"

    "path/filepath"

    "strings"

)


func HideFile(filename string) error {

    if !strings.HasPrefix(filepath.Base(filename), ".") {

        err := os.Rename(filename, "."+filename)

        if err != nil {

            return err

        }

    }

    return nil

}

hide/hide_windows.go:


// +build windows


package main


import (

    "syscall"

)


func HideFile(filename string) error {

    filenameW, err := syscall.UTF16PtrFromString(filename)

    if err != nil {

        return err

    }

    err = syscall.SetFileAttributes(filenameW, syscall.FILE_ATTRIBUTE_HIDDEN)

    if err != nil {

        return err

    }

    return nil

}

输出(Linux):


$ tree hide

hide

├── attrib.go

├── hide.go

└── hide_windows.go

$


$ go build && ./hide

hidden: test.hidden.file

$ ls -a .test.hidden.file

.test.hidden.file

输出(视窗):


>go build && hide

hidden: test.hidden.file

>attrib test.hidden.file

A   H        \test.hidden.file

>


查看完整回答
反对 回复 2023-06-01
?
千万里不及你

TA贡献1784条经验 获得超9个赞

制作一个这样的文件:


//go:generate mkwinsyscall -output zhide.go hide.go

//sys setFileAttributes(name string, attr int) (err error) = kernel32.SetFileAttributesW

package main


const (

   file_attribute_hidden = 2

   file_attribute_normal = 128

)


func main() {

   setFileAttributes("file.txt", file_attribute_hidden)

}

然后构建:


go mod init hide

go mod tidy

go generate

go build


查看完整回答
反对 回复 2023-06-01
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

我为此制作了一个跨平台模块(可在此处获得:higgs)。您只需调用或Hide函数即可隐藏或取消隐藏文件或目录Unhide。


示例代码:


package main


import (

    "fmt"

    "github.com/dastoori/higgs"

)


func main() {

    err := higgs.Hide("foo.txt")

    

    if err != nil {

        fmt.Println(err)

    }

}


查看完整回答
反对 回复 2023-06-01
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

import (

    _ "golang.org/x/sys/windows"

    "os"

    "runtime"

    "syscall"

)


func HideFile(filename string) (status bool, err error) {

    if runtime.GOOS == "windows" {

        filenameW, err := syscall.UTF16PtrFromString(filename)

        if err != nil {

            return false, err

        }


        err = syscall.SetFileAttributes(filenameW, syscall.FILE_ATTRIBUTE_HIDDEN)

        if err != nil {

            return false, err

        }

    } else {

        if filename[0:1] != "." {

            err = os.Rename(filename, "." + filename)

            if err != nil {

                return false, err

            }

        }

    }


    return true, nil

}

那是我的代码。但是无法在Linux中构建。


错误:


src/util/hidden.go:12:21: undefined: syscall.UTF16PtrFromString

src/util/hidden.go:17:9: undefined: syscall.SetFileAttributes

src/util/hidden.go:17:46: undefined: syscall.FILE_ATTRIBUTE_HIDDEN


查看完整回答
反对 回复 2023-06-01
  • 4 回答
  • 0 关注
  • 213 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信