Войти

Показать полную графическую версию : Написать калькулятор прав chmod


blackeangel
14-06-2017, 22:27
Собственно у меня только один вопрос:
Как считать текст?
То есть мы имеем
r=4
w=2
x=1
А вот есть -rwxr-xr-x, которому соответствует 755.
Получается надо читать посимвольно со второго знака куда то, при этом сравнивая с этими условиями и писать куда-то как числа, переводя строки в числа, потом складывать и снова писать в текст?

Iska
14-06-2017, 23:11
А вот есть -rwxr-xr-x »
Вы не путаете? Пишут, что есть «rwxr-xr-x», но не «-rwxr-xr-x». То есть группа «rwx» — «владелец», группа «r-x» — «группа» и группа «r-x» — «остальные».

есть -rwxr-xr-x, которому соответствует 755.
Получается надо читать посимвольно со второго знака куда то, при этом сравнивая с этими условиями и писать куда-то как числа, переводя строки в числа, потом складывать и снова писать в текст? »
Читать надо регуляркой, разбивая на группы по три символа и одновременно проверяя на допустимость символов, например:
([r\-][w\-][x\-])([r\-][w\-][x\-])([r\-][w\-][x\-])
Затем каждую группу из найденного соответствия переводите в двоичный вид по принципу:

на позиции 2 символ «-» — значит это будет «0», иначе — «1»;
на позиции 1 символ «-» — значит это будет «0», иначе — «1»;
на позиции 0 символ «-» — значит это будет «0», иначе — «1».

Для указанного выражения получаем для групп:
двоичное 111, т.е. 1·2² + 1·2¹ + 1·2° = 4 + 2 + 1 = 7;
двоичное 101, т.е. 1·2² + 0·2¹ + 1·2° = 4 + 0 + 1 = 5;
двоичное 101, т.е. 1·2² + 0·2¹ + 1·2° = 4 + 0 + 1 = 5.

Обратное преобразование будет куда проще.

Как это лучше всего будет оформить-реализовать в Java, я Вам, разумеется, не подскажу.

blackeangel
14-06-2017, 23:23
Вы не путаете? Пишут, что есть «rwxr-xr-x», но не «-rwxr-xr-x». То есть группа «rwx» — «владелец», группа «r-x» — «группа» и группа «r-x» — «остальные». »
Нет, не путаю. Первый символ может быть:
d - для папок;
l - для ссылок.
То есть для папки с разрешениями 755 это будет выглядеть следующим образом: drwxr-xr-x.

регулярка это мысль.
Но думаю разбить на 3 группы: с 2го по 4й символ, с 5 по 7 символ, с 8 по 10 символ через substring и закинуть в один цикл хождения по символам сразу трех групп.

Iska
14-06-2017, 23:46
Нет, не путаю. Первый символ может быть: »
Тогда поправьте шаблон регулярки в правильном направлении.

Но думаю разбить на 3 группы: с 2го по 4й символ, с 5 по 7 символ, с 8 по 10 символ через substring и закинуть в один цикл хождения по символам сразу трех групп. »
Регуляркой будет а) проще и б) Вы сразу, ей же, сделаете проверку на допустимые символы.

shisik
14-06-2017, 23:48
Но думаю разбить на 3 группы: с 2го по 4й символ, с 5 по 7 символ, с 8 по 10 символ через substring и закинуть в один цикл хождения по символам сразу трех групп. »

Регэксп это уже сделает за вас. По крайней мере на 3 группы разбивает.

Нет, не путаю. Первый символ может быть:
d - для папок;
l - для ссылок. »

Ну так добавьте ещё ([bcdlps-]) в начало - будет вам флаг типа.

blackeangel
14-06-2017, 23:51
Iska, думаю как то так:

^.*([r\\-][w\\-][x\\-])([r\\-][w\\-][x\\-])([r\\-][w\\-][x\\-])$

(Регулярки на java и vb очень похожи)

shisik
14-06-2017, 23:53
.* »

Не думаю, что эт охорошая мысль. Допустимые символы там тоже строго регламентированы, так что лучше ([bcdlps-]). Ну или [bcdlps-] если флаг не нужен.

blackeangel
15-06-2017, 00:09
shisik, есть уже готовое решение на другом форуме.

private static String getDigits(String s) {
if (!s.matches(".*([r-][w-][x-]){3}$")) {
throw new IllegalArgumentException("Achtung!");
}
Function<String, String> rwxMapper = rwx -> String.valueOf(Integer.parseInt(rwx.replaceAll("[rwx]", "1").replaceAll("-", "0"), 2));
return Arrays.stream(s.substring(s.length() - 9).split("(?<=\\G...)")).map(rwxMapper).collect(joining());
}

Но всегда должно быть альтернативное решение.
И, очень важно, понять что же там происходит.




© OSzone.net 2001-2012