Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 如何使用Erlang文件:读取文件信息权限/模式信息?_File_Permissions_Erlang - Fatal编程技术网

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

File 如何使用Erlang文件:读取文件信息权限/模式信息?,file,permissions,erlang,File,Permissions,Erlang,文件的Erlang文档:read_file_info/1状态为“文件权限[是]总和”和“其他位…可能已设置”,这并不能增强信心。而且,谷歌不是我在这里的朋友 我希望在Linux机器上采用file:read\u file\u info/1返回的模式,例如33188,并将其转换为更易于人类阅读和/或识别的模式,如rw-r--r--或644 非常感谢任何提示、链接或指导。捷径: io_lib:format("~.8B", [Mode]). 。。。或: io_lib:format("~.8B", [M

文件的Erlang文档:read_file_info/1
状态为“文件权限[是]总和”和“其他位…可能已设置”,这并不能增强信心。而且,谷歌不是我在这里的朋友

我希望在Linux机器上采用
file:read\u file\u info/1
返回的模式,例如
33188
,并将其转换为更易于人类阅读和/或识别的模式,如
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.
用于
模式=33204
的这个(函数
print/1
)将为您提供以下结果:
“rw-rw-r--”


如果其中有不清楚的地方,我将尝试阐述我提供的代码片段背后的基本内容

正如@macintux已经提到的,
33204
实际上是八进制数100664的十进制表示。这三个最低的八进制数字(
664
)可能就是您所需要的,因此我们通过按位and(
band
)运算得到它们,最高的数字适合三个八进制数字(
8#777
)。这就是为什么short way如此短的原因——您只需告诉erlang将
模式
转换为字符串,就好像它是八进制数一样

您提到的第二种表示法(如
rw-rw-r--
ls
吐出的东西)很容易从
模式的二进制表示法中复制出来。请注意,三个八进制数字正好是九个二进制数字(
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.

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

捷径:

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.
用于
模式=33204
的这个(函数
print/1
)将为您提供以下结果:
“rw-rw-r--”


如果其中有不清楚的地方,我将尝试阐述我提供的代码片段背后的基本内容

正如@macintux已经提到的,
33204
实际上是八进制数100664的十进制表示。这三个最低的八进制数字(
664
)可能就是您所需要的,因此我们通过按位and(
band
)运算得到它们,最高的数字适合三个八进制数字(
8#777
)。这就是为什么short way如此短的原因——您只需告诉erlang将
模式
转换为字符串,就好像它是八进制数一样

您提到的第二种表示法(如
rw-rw-r--
ls
吐出的东西)很容易从
模式的二进制表示法中复制出来。请注意,三个八进制数字正好是九个二进制数字(
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.


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

这里有一个起点:stat-r“filename”会给您类似的信息:“16777220 120436471 0100755 1 501 20 0 8 1351450865 1351450865 1351450865 1351450865 4096 8 0 foo”,其中第三个值是八进制形式的文件权限。将其转换为整数,您将得到33188(或等效值)值。这里是一个起点:stat-r“filename”将给出类似于:“16777220 120436471 0100755 1 501 20 0 8 1351450865 1351450865 1351450865 1351450865 4096 8 0 foo”的值,其中第三个值是八进制形式的文件权限。将其转换为整数,您将得到33188(或等效值)。