2

Erlang のドキュメントでは、file:read_file_info/1"file permissions [are] the sum" と "other bits...may be set" の状態が示されていますが、自信が持てません。そして、ここでは Google は私の友人ではありません。

file:read_file_info/1たとえば、Linux マシンでによって返されたモードを取り、または のように、より人間が読み取り可能および/または認識可能なものに変換することを検討してい33188ます。rw-r--r--644

ヒント、リンク、または指示は大歓迎です。

4

1 に答える 1

4

簡単な方法:

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

... また:

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

これらの2つは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.

この1つ(関数print/1)はMode = 33204、結果としてこれを提供します"rw-rw-r--"


不明な点がある場合は、提供したスニペットの背後にある基本的なことを説明しようと思います。

@macintuxがすでに述べたように33204、実際には8進数100664の10進数表現です。これらの3つの下位8進数(664)はおそらく必要なものであるため、ビット単位で取得し、(band)に適合する最大数の演算を実行します。 8進数の3桁(8#777)。そのため、短い方法は非常に短いのです。erlangにMode、8進数であるかのように文字列に変換するように指示するだけです。

あなたが言及した2番目の表現(たとえばrw-rw-r--ls吐き出すもの)は、Mode数値の2進表現から簡単に再現できます。3つの8進数は、正確に9つの2進数(8#644 = 2#110110100)になることに注意してください。実際、これは、対応する数字がに等しい場合rwxrwxrwxに各要素が置き換えられる文字列です。数字の場合、要素は変更されません。-01

したがって、これを達成するための少しクリーンなアプローチがあります。

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.

私はあなたがポイントを得たことを望みます。とにかく、疑問がある場合はコメントで質問してください。

于 2012-11-01T21:26:08.473 に答える