file - 如何使用Erlang文件:read_file_info permissions/mode info?

标签 file permissions erlang

file:read_file_info/1 的 Erlang 文档声明“文件权限 [是] 总和”和“其他位......可以设置”,而不是灌输信心。而且,Google 一直不是我的 friend 。

我希望采用 file:read_file_info/1 返回的模式,例如33188,在 Linux 机器上并将其转换为更易读和/或可识别的内容,例如 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.

这个(函数 print/1 )用于 Mode = 33204结果会给你这个:"rw-rw-r--" .


如果有人不清楚,我会尝试阐述我提供的片段背后的基本内容。

正如@macintux 已经提到的,33204实际上是八进制数 100664 的十进制表示。这三个最低的八进制数字 ( 664 ) 可能是您需要的,因此我们通过按位与 ( band ) 运算得到它们,其中最大的数字适合三个八进制数字 ( 8#777 )。这就是为什么 short way 如此之短——你只需告诉 erlang 转换 Mode将字符串当作八进制数。

您提到的第二种表示形式(如 rw-rw-r--ls 吐出的东西)很容易从 Mode 的二进制表示形式重现。数字。请注意,三个八进制数字将为您提供九个二进制数字 ( 8#644 = 2#110110100 )。事实上这是字符串 rwxrwxrwx其中每个元素替换为 -如果相应的数字等于 0 .如果数字是 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.

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

关于file - 如何使用Erlang文件:read_file_info permissions/mode info?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13183838/

相关文章:

c# - 在套接字编程c#中发送大文件

java - Eclipse - 在多个文件之间跳转的一般用法

linux - Linux 上的 Node 中的 "Permission Denied",在运行 start-script/w local nodemon/mocha/babel-node 时

linux - 我如何在 Linux 中设置权限,以便两个用户可以更新服务器上的同一个 SVN 工作副本?

erlang - 让进程 sleep 随机时间 - Erlang

Erlang计算HMAC-SHA1的例子?

ssh - Erlang 是否有权访问发送到 ssh :daemon? 的公钥

delphi - 音频文件标记(读/写)库?

java - 扫描仪与 InputStreamReader

permissions - 隐藏 Typo3 中的删除按钮