gpt4 book ai didi

go - 如何在go中检查文件是否可执行?

转载 作者:行者123 更新时间:2023-12-01 19:36:44 27 4
gpt4 key购买 nike

我将如何编写一个函数来检查文件在 Go 中是否可执行?给定一个 os.FileInfo ,我可以得到os.FileInfo.Mode() ,但我在尝试解析权限位时停滞不前。

测试用例:

#!/usr/bin/env bash
function setup() {
mkdir -p test/foo/bar
touch test/foo/bar/{baz.txt,quux.sh}
chmod +x test/foo/bar/quux.sh
}

function teardown() { rm -r ./test }

setup

import (
"os"
"path/filepath"
"fmt"
)

func IsExectuable(mode os.FileMode) bool {
// ???
}

func main() {
filepath.Walk("test", func(path string, info os.FileInfo, err error) error {
if err != nil || info.IsDir() {
return err
}
fmt.Printf("%v %v", path, IsExectuable(info.Mode().Perm()))
}
}
// should print "test/foo/bar/baz.txt false"
// "test/foo/bar/quux.txt true"

我只关心 Unix 文件,但如果该解决方案也适用于 Windows,则额外加分。

最佳答案

文件是否可执行存储在Unix permission bits (由 FileMode.Perm() 返回,它基本上是最低的 9 位(0777 八进制位掩码)。请注意,由于我们在下面的解决方案中使用位掩码来屏蔽其他位,因此不需要调用 Perm()

它们的含义是:

rwxrwxrwx

其中前 3 位用于所有者,接下来的 3 位用于组,后 3 位用于其他。

要判断文件是否可由其所有者执行,请使用位掩码 0100 :
func IsExecOwner(mode os.FileMode) bool {
return mode&0100 != 0
}

类似地,要判断组是否可执行,请使用位掩码 0010 :
func IsExecGroup(mode os.FileMode) bool {
return mode&0010 != 0
}

和其他人,使用位掩码 0001 :
func IsExecOther(mode os.FileMode) bool {
return mode&0001 != 0
}

要判断文件是否可以通过上述任何一种方式执行,请使用位掩码 0111 :
func IsExecAny(mode os.FileMode) bool {
return mode&0111 != 0
}

要判断文件是否可以被上述所有文件执行,再次使用位掩码 0111但检查结果是否等于 0111 :
func IsExecAll(mode os.FileMode) bool {
return mode&0111 == 0111
}

关于go - 如何在go中检查文件是否可执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60128401/

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