go语言os.FileMode函数如何从整数/八进制/转换权限???在设置标志之前?

Rob*_*gen 4 unix chmod go

更新:根据到目前为止的评论和回复,我想我应该明确表示我理解 0700 是十进制数 448 的八进制表示形式。我在这里关心的是,当八进制模式参数或十进制数被重铸为八进制并传递给 os.FileMode 方法,使用 WriteFile 创建的文件的最终权限似乎没有以有意义的方式排列。

\n\n

我尽了最大努力将问题的规模缩小到其本质,也许我需要再进行一轮

\n\n
\n\n

Update2:重新阅读后,我想我可以更简洁地陈述我的问题。调用 os.FileMode(700) 应该与使用二进制值 1-010-111-100 调用它相同。对于这 9 个最低有效位,应该有以下权限:

\n\n

--w-rwxr--或八进制的 274(并翻译回

\n\n

相反,该 FileMode 会导致 WriteFile 使用以下命令创建文件:

\n\n

--w-r-xr--八进制表示为 254。

\n\n
\n\n

当使用用 go 编写的内部实用程序时,使用 ioutil.WriteFile() 创建文件时使用十进制 700 而不是八进制 0700 导致文件创建权限错误。即:\n ioutil.WriteFile("decimal.txt", "filecontents", 700) <- wrong!\nioutil.WriteFile("octal.txt", "filecontents", 0700) <- correct!

\n\n

当使用十进制数(即没有前导零将其标识为 go_lang 的八进制数)时,应该具有权限的文件\n0700 -> \'-rwx------\'具有0254 -> \'--w-r-xr--\'

\n\n

修复后,我注意到当我将 700 十进制转换为八进制时,我得到的是 \xe2\x80\x9c1274\xe2\x80\x9d 而不是“0254”的实验结果。

\n\n

当我将 700 十进制转换为二进制时,我得到:(1-010-111-100我在 rwx\xe2\x80\x99 分隔处添加了破折号)。除了设置的前导位之外,这看起来像是“0274”的权限。

\n\n

我查看了FileMode 的 go 文档,发现 FileMode 的底层是一个 uint32。九个最小位映射到标准 unix 文件 perm 结构。前 12 位表示特殊文件功能。我认为第十位中的一位领先位处于未使用的领域。

\n\n

我仍然很困惑,所以我尝试:

\n\n\n\n
package main\nimport (\n    "io/ioutil"\n    "fmt"\n    "os"\n)\n\nfunc main() {\n    content := []byte("temporary file\'s content")\n    modes := map[string]os.FileMode{\n        "700": os.FileMode(700),\n        "0700": os.FileMode(0700),\n        "1274": os.FileMode(1274),\n        "01274": os.FileMode(01274)}\n    for name, mode := range modes {\n        if err := ioutil.WriteFile(name, content, mode); err != nil {\n            fmt.Println("error creating ", name, " as ", mode)\n        }\n        if fi, err := os.Lstat(name); err == nil {\n            mode := fi.Mode()\n            fmt.Println("file\\t", name, "\\thas ", mode.String())\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

而现在我更加困惑了。我得到的结果是:

\n\n
file     700    has  --w-r-xr--\nfile     0700   has  -rwx------\nfile     1274   has  --wxr-x---\nfile     01274  has  --w-r-xr--\n
Run Code Online (Sandbox Code Playgroud)\n\n

并通过查看文件系统得到确认:

\n\n
--w-r-xr--     1 rfagen  staff           24 Jan  5 17:43 700\n-rwx------     1 rfagen  staff           24 Jan  5 17:43 0700\n--wxr-x---     1 rfagen  staff           24 Jan  5 17:43 1274\n--w-r-xr--     1 rfagen  staff           24 Jan  5 17:43 01274\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 第一个是触发内部应用程序中原始错误的损坏情况。
  • \n
  • 第二个是更正后的代码,按预期工作。
  • \n
  • 第三个很奇怪,十进制的 1274 似乎翻译成 0350
  • \n
  • 第四种情况有点扭曲,因为 dec(700)->oct(1274) 并明确要求 01274 给出与第一种情况相同的令人费解的 0254。
  • \n
\n\n

我模糊地怀疑大于 2^9 的数字的额外部分在某​​种程度上弄乱了它,但我无法弄清楚,即使在查看了FileMode 的源代码之后也是如此。据我所知,它只查看 12 MSB 和 9 LSB。

\n

Mar*_*arc 5

os.FileMode只知道整数,它不关心文字表示是否是八进制。

以 8 为基数进行解释的事实0700来自语言规范本身:

整数文字是表示整数常量的数字序列。可选前缀设置非十进制基数:0 表示八进制,0x 或 0X 表示十六进制。在十六进制文字中,字母 af 和 A​​F 代表值 10 到 15。

这是在编程语言中表示文字八进制数的相当标准的方式。