go语言os.FileMode函数如何从整数/八进制/转换权限???在设置标志之前?
来源:stackoverflow
时间:2024-04-12 15:21:37 495浏览 收藏
一分耕耘,一分收获!既然打开了这篇文章《go语言os.FileMode函数如何从整数/八进制/转换权限???在设置标志之前?》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!
更新:根据迄今为止的评论和回复,我想我应该明确表示我理解 0700 是十进制数 448 的八进制表示形式。我在这里担心的是,当八进制mode 参数或当十进制数被重新转换为八进制并传递给 os.filemode 方法时,使用 writefile 创建的文件的最终权限似乎没有以有意义的方式排列。
我尽了最大努力将问题的规模缩小到其本质,也许我需要再进行一轮
update2:重新阅读后,我想我可以更简洁地陈述我的问题。调用 os.filemode(700) 应该与使用二进制值 1-010-111-100 调用它相同。对于这 9 个最低有效位,应该具有以下权限:
--w-rwxr--
或八进制的 274(并转换回
相反,filemode 会导致 writefile 使用以下内容创建文件:
--w-r-xr--
,八进制为 254。
使用 go 编写的内部实用程序时,使用 ioutil.writefile() 创建文件时使用十进制 700 而不是八进制 0700,导致文件创建权限错误。那是:
ioutil.writefile("decimal.txt", "filecontents", 700) <- 错误!
ioutil.writefile("octal.txt", "filecontents", 0700) <-正确!
当使用十进制数(即没有前导零将其识别为 go_lang 的八进制数)时,应该具有权限的文件
0700 -> '-rwx--------'
有 0254 -> '--w-r-xr--'
修复后,我注意到当我将 700 十进制转换为八进制时,我得到的是“1274”,而不是实验结果“0254”。
当我将 700 十进制转换为二进制时,我得到:1-010-111-100
(我在分隔 rwx 的地方添加了破折号)。除了设置的前导位之外,这看起来像是“0274”的权限。
我查看了 filemode 的 go 文档,发现 filemode 的底层是一个 uint32。九个最小位映射到标准 unix 文件 perm 结构。前 12 位表示特殊文件功能。我认为第十位的一位前导位处于未使用的区域。
我还是很困惑,所以我尝试了:
package main import ( "io/ioutil" "fmt" "os" ) func main() { content := []byte("temporary file's content") modes := map[string]os.filemode{ "700": os.filemode(700), "0700": os.filemode(0700), "1274": os.filemode(1274), "01274": os.filemode(01274)} for name, mode := range modes { if err := ioutil.writefile(name, content, mode); err != nil { fmt.println("error creating ", name, " as ", mode) } if fi, err := os.lstat(name); err == nil { mode := fi.mode() fmt.println("file\t", name, "\thas ", mode.string()) } } }
现在我更困惑了。我得到的结果是:
file 700 has --w-r-xr-- file 0700 has -rwx------ file 1274 has --wxr-x--- file 01274 has --w-r-xr--
并通过查看文件系统得到确认:
--w-r-xr-- 1 rfagen staff 24 Jan 5 17:43 700 -rwx------ 1 rfagen staff 24 Jan 5 17:43 0700 --wxr-x--- 1 rfagen staff 24 Jan 5 17:43 1274 --w-r-xr-- 1 rfagen staff 24 Jan 5 17:43 01274
- 第一个是触发内部应用程序中原始错误的损坏情况。
- 第二个是更正后的代码,可以按预期工作。
- 第三个很奇怪,十进制 1274 似乎可以翻译成 0350
- 第四种情况有点扭曲,因为 dec(700)->oct(1274) 并明确要求 01274 会给出与第一种情况相同的令人费解的 0254。
我有一个模糊的怀疑,大于 2^9 的数字的额外部分在某种程度上弄乱了它,但我无法弄清楚,即使在查看了 filemode 的源代码之后。据我所知,它只查看 12 msb 和 9 lsb。
解决方案
os.FileMode
只知道整数,它不关心文字表示是否是八进制。
0700
以基数 8 进行解释的事实来自 language spec 本身:
这是编程语言中相当标准的 representing literal octal numbers 方式。
本篇关于《go语言os.FileMode函数如何从整数/八进制/转换权限???在设置标志之前?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!
-
502 收藏
-
502 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
139 收藏
-
204 收藏
-
325 收藏
-
477 收藏
-
486 收藏
-
439 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习