繁体   English   中英

如何使用Erlang文件:read_file_info权限/模式信息?

[英]How to use Erlang file:read_file_info permissions/mode info?

用于file:read_file_info/1的Erlang文档指出“文件许可权是和”和“其他位...可以被设置”,这并不灌输信心。 而且,Google在这里不是我的朋友。

我希望在Linux机器上采用file:read_file_info/1返回的模式,例如33188 ,并将其转换为更易于file:read_file_info/1和/或识别的东西,例如rw-r--r--644

任何提示,链接或指示,我们将不胜感激。

简短的方法:

io_lib:format("~.8B", [Mode]).

... 要么:

io_lib:format("~.8B", [Mode band 8#777]).

对于Mode = 33204这两个将分别给您: ["100664"]["664"]

很长的路要走:

print(Mode) ->
    print(Mode band 8#777, []).

print(0, Acc) when length(Acc) =:= 9 ->
    Acc;
print(N, Acc) ->
    Char = perm(N band 1, length(Acc) rem 3),
    print(N bsr 1, [Char | Acc]).

perm(0, _) ->
    $-;
perm(1, 0) ->
    $x;
perm(1, 1) ->
    $w;
perm(1, 2) ->
    $r.

Mode = 33204该代码(功能print/1 )将为您提供结果: "rw-rw-r--"


如果不清楚的是什么,我将尝试在提供的摘录中阐述一些基本内容。

正如@macintux所提到的, 33204实际上是八进制数100664的十进制表示形式。这三个最低的八进制数字( 664 )可能是您所需要的,因此,我们使用最高的按位和( band )操作来获取它们。可以容纳三个八进制数字的数字( 8#777 )。 这就是为什么短途之路如此之短的原因-您只是告诉erlang将Mode转换为字符串,就好像它是八进制数字一样。

您提到的第二个表示形式(如rw-rw-r--ls吐出的东西)可以很容易地从Mode编号的二进制表示中重现。 请注意,三个八进制数字将恰好为您提供九个二进制数字( 8#644 = 2#110110100 )。 实际上,这是字符串rwxrwxrwx ,其中每个元素都由-替换,如果对应的数字等于0 如果digit为1该元素保持不变。

因此,有一种更简洁的方法可以实现此目的:

print(Mode) ->
    print(Mode band 8#777, lists:reverse("rwxrwxrwx"), []).

print(0, [], Acc) ->
    Acc;
print(N, [Char0 | Rest], Acc) ->
    Char = char(N band 1, Char0),
    print(N bsr 1, Rest, [Char | Acc]).

char(0, _) ->
    $-;
char(1, C) ->
    C.

我希望你明白了。 如果您有任何疑问,请随时在评论中提出任何问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM