cpp

Права доступа к файлу и каталогу

В операционной системе семейства UNIX для каждого объекта (файла или каталога) назначаются права доступа для каждой разновидности пользователей — владельца, группы и прочих. Для файла или каталога могут быть назначены следующие права доступа:

  • чтение;
  • запись;
  • выполнение.

Права доступа обозначаются буквами:

  • r — файл можно читать, а содержимое каталога можно просматривать;
  • w — файл можно модифицировать, удалять и переименовывать, а в каталоге можно создавать или удалять файлы. Каталог можно переименовать или удалить;
  • x — файл можно выполнять, а в каталоге можно выполнять операции над файлами, в том числе искать в нем файлы.

Права доступа к файлу определяются записью типа:

-rw-r--r--

Первый символ означает, что это файл, и не задает никаких прав доступа. Далее три символа (rw−) задают права доступа для владельца (чтение и запись). Символ – означает, что права доступа на выполнение нет. Следующие три символа задают права доступа для группы (r--) — только чтение. Последние три символа (r--) задают права для всех остальных пользователей (только чтение).

Права доступа к каталогу определяются такой строкой:

drwxr-xr-x

Первая буква (d) означает, что это каталог. Владелец может выполнять в каталоге любые действия (rwx), а группа и все остальные пользователи — только читать и выполнять поиск (r−x). Для того чтобы каталог можно было просматривать, должны быть установлены права на выполнение (x).

Кроме того, права доступа могут обозначаться числом. Такие числа называются маской прав доступа. Число состоит из трех цифр от 0 до 7. Первая цифра задает права для владельца, вторая — для группы, а третья — для всех остальных пользователей. Например, права доступа rw-r--r-- можно записать так: 110 100 100, что переводится в восьмеричное число 0o644. Таким образом, если право предоставлено, то в соответствующей позиции стоит 1, а если нет — то 0:

fmt.Printf("%b\n", 0o644) // 110100100

Можно также задать дополнительные права доступа с помощью следующих констант (описание констант см. в документации):

fmt.Printf("%b\n", fs.ModeDir)        // 10000000000000000000000000000000
fmt.Printf("%b\n", fs.ModeAppend)     // 1000000000000000000000000000000
fmt.Printf("%b\n", fs.ModeExclusive)  // 100000000000000000000000000000
fmt.Printf("%b\n", fs.ModeTemporary)  // 10000000000000000000000000000
fmt.Printf("%b\n", fs.ModeSymlink)    // 1000000000000000000000000000
fmt.Printf("%b\n", fs.ModeDevice)     // 100000000000000000000000000
fmt.Printf("%b\n", fs.ModeNamedPipe)  // 10000000000000000000000000
fmt.Printf("%b\n", fs.ModeSocket)     // 1000000000000000000000000
fmt.Printf("%b\n", fs.ModeSetuid)     // 100000000000000000000000
fmt.Printf("%b\n", fs.ModeSetgid)     // 10000000000000000000000
fmt.Printf("%b\n", fs.ModeCharDevice) // 1000000000000000000000
fmt.Printf("%b\n", fs.ModeSticky)     // 100000000000000000000
fmt.Printf("%b\n", fs.ModeIrregular)  // 10000000000000000000
fmt.Printf("%b\n", fs.ModeType)       // 10001111001010000000000000000000
fmt.Printf("%b\n", fs.ModePerm)       // 111111111

При создании файла режим доступа можно указать в параметре perm функции OpenFile():

os.OpenFile(name string, flag int,
            perm fs.FileMode) (*os.File, error)
type FileMode uint32

Чтобы изменить права доступа, следует воспользоваться функцией Chmod(). Формат функции:

os.Chmod(name string, mode fs.FileMode) error

В параметре mode указывается восьмеричное число, являющееся маской прав доступа. В Windows можно изменить только право на чтение. Сделаем файл доступным только для чтения в Windows:

fmt.Println(os.Chmod(`C:\book\file.txt`, 0o400)) // <nil>

Разрешим чтение и запись:

fmt.Println(os.Chmod(`C:\book\file.txt`, 0o600)) // <nil>

Тип данных fs.FileMode содержит следующие методы:

  • IsDir() — возвращает true, если права доступа заданы для каталога, и false — в противном случае. Формат метода:
(fs.FileMode).IsDir() bool

Пример:

var m fs.FileMode = fs.ModeDir
fmt.Println(m.IsDir()) // true
m = 0o777
fmt.Println(m.IsDir()) // false
  • IsRegular() — возвращает true, если права доступа заданы для файла, и false — в противном случае. Формат метода:
(fs.FileMode).IsRegular() bool

Пример:

var m fs.FileMode = fs.ModeDir
fmt.Println(m.IsRegular()) // false
m = 0o777
fmt.Println(m.IsRegular()) // true
  • Perm() — возвращает права доступа для UNIX (m & fs.ModePerm). Формат метода:
(m fs.FileMode).Perm() fs.FileMode

Пример:

var m fs.FileMode = fs.ModeDir
fmt.Printf("%b\n", m.Perm()) // 0
m = 0o644
fmt.Printf("%b\n", m.Perm()) // 110100100
  • Type() — возвращает права доступа для типа (m & fs.ModeType). Формат метода:
(m fs.FileMode).Type() fs.FileMode

Пример:

var m fs.FileMode = fs.ModeDir
fmt.Printf("%b\n", m.Type()) // 10000000000000000000000000000000
m = 0o644
fmt.Printf("%b\n", m.Type()) // 0
  • String() — возвращает значение в виде строки. Формат метода:
(fs.FileMode).String() string

Пример:

var m fs.FileMode = fs.ModeDir
fmt.Println(m.String()) // d---------
m = 0o644
fmt.Println(m.String()) // -rw-r--r--
fmt.Println(m)          // -rw-r--r--

Получить маску прав доступа позволяет функция Stat() из пакета os. Формат функции:

os.Stat(name string) (fs.FileInfo, error)

Маску возвращает метод Mode() объекта fs.FileInfo. Формат метода:

(fs.FileInfo).Mode() fs.FileMode

Пример:

info, err := os.Stat(`C:\book\file.txt`)
if err == nil {
   fmt.Println(info.Mode()) // -rw-rw-rw-
}

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp