簡體   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