[英]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.