亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

java中的chmod根據模式而不是字符串

java中的chmod根據模式而不是字符串

臨摹微笑 2022-05-25 15:38:33
我在 java 中有一個動態 int 代表模式,例如:450、777 等我需要更改現有文件權限,我嘗試探索 Files.setPosixFilePermissions Api 但這需要字符串格式的模式,如 -rw-r--r--Files.setPosixFilePermissions(    path,    PosixFilePermissions.fromString("-rw-r--r--"));但是,如果它的數字而不是像 450、777 這樣的字符串在運行時可以是任何東西,我該如何實現呢?
查看完整描述

2 回答

?
阿波羅的戰車

TA貢獻1862條經驗 獲得超6個贊

您可以通過如下簡單的轉換來做到這一點:


    public class Chmod {


        public Set<PosixFilePermission> fromInt(int perms) {

            final char[] ds = Integer.toString(perms).toCharArray();

            final char[] ss = {'-','-','-','-','-','-','-','-','-'};

            for (int i = ds.length-1; i >= 0; i--) {

                int n = ds[i] - '0';

                if (i == ds.length-1) {

                    if ((n & 1) != 0) ss[8] = 'x';

                    if ((n & 2) != 0) ss[7] = 'w';

                    if ((n & 4) != 0) ss[6] = 'r';

                }

                else if (i == ds.length-2) {

                    if ((n & 1) != 0) ss[5] = 'x';

                    if ((n & 2) != 0) ss[4] = 'w';

                    if ((n & 4) != 0) ss[3] = 'r';

                }

                else if (i == ds.length-3) {

                    if ((n & 1) != 0) ss[2] = 'x';

                    if ((n & 2) != 0) ss[1] = 'w';

                    if ((n & 4) != 0) ss[0] = 'r';

                }

            }

            String sperms = new String(ss);

            System.out.printf("%d -> %s\n", perms, sperms);

            return PosixFilePermissions.fromString(sperms);

        }


        public static void main(String[] args) throws Exception {

            Chmod test = new Chmod();

            test.fromInt(444);

            test.fromInt(1);

            test.fromInt(777);

            test.fromInt(666);

            test.fromInt(604);

            test.fromInt(0);

        }


    }


查看完整回答
反對 回復 2022-05-25
?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

引用維基百科,您只需弄清楚這些數字是如何產生的:

數字符號

另一種表示 Unix 權限的方法是八進制(base-8)表示法,如 stat -c %a 所示。該符號至少由三位數字組成。最右邊的三個數字中的每一個都代表權限的不同組成部分:所有者、組和其他。(如果存在第四位數字,則最左邊(高位)數字地址三個附加屬性,setuid 位、setgid 位和粘性位。)

這些數字中的每一個都是二進制數字系統中其組成位的總和。結果,特定位添加到總和中,因為它由數字表示:

  • 讀取位的總數加 4(二進制 100),

  • 寫入位的總數加 2(二進制 010),并且

  • 執行位將其總數加 1(二進制 001)。

...結束報價

換句話說:您需要做一些二進制掩碼來計算表達該數字所需的 r、w、x 字符。

您可以手動執行此操作,請參見此處此處


查看完整回答
反對 回復 2022-05-25
  • 2 回答
  • 0 關注
  • 279 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號