如何使用 Haskell 检查 Linux 文件的文件权限?

问题描述 投票:0回答:1

如何判断文件所有者是否具有写/读/可执行权限?

我找到了

FileMode
http://hackage.haskell.org/package/base-4.10.0.0/docs/System-Posix-Types.html#t:FileMode,但我似乎找不到一种简单的方法来确定权限。

linux haskell filesystems file-permissions
1个回答
3
投票

FileMode
CMode
的类型别名,是一个 32 位数字。该包还包含常量,如
ownerReadMode
ownerWriteMode
ownerExecuteMode
groupReadMode
groupWriteMode
groupExecuteMode
otherReadMode
otherWriteMode
otherExecuteMode

您可以使用

intersectFileModes :: FileMode -> FileMode -> FileMode
来确定交集。如果与其中一个常量的交集与该常量相同,则该文件具有该模式。

例如:

import System.Posix.Files(getFileStatus,fileMode,ownerReadMode)
import System.Posix.Files.ByteString(intersectFileModes)

main = do
    fs <- getFileStatus "foo.file"
    if intersectFileModes (fileMode fs) ownerReadMode == ownerReadMode
        then print "owner can read"
        else print "owner can not read"

为了更方便,我们可以定义一个函数:

import System.Posix.Types(FileMode)
import System.Posix.Files.ByteString(intersectFileModes)

hasMode :: FileMode -> FileMode -> Bool
hasMode fa fb = intersectFileModes fa fb == fa

因此函数

hasMode ownerReadMode
将检查文件模式,如果文件模式包含该权限则返回
True
,否则返回
False

现在我们可以将上面的程序重写为:

import System.Posix.Types(FileMode)
import System.Posix.Files(getFileStatus,fileMode,ownerReadMode)
import System.Posix.Files.ByteString(intersectFileModes)

hasMode :: FileMode -> FileMode -> Bool
hasMode fa fb = intersectFileModes fa fb == fa

main = do
    fs <- getFileStatus "../README.md"
    if hasMode ownerReadMode (fileMode fs)
        then print "owner can read"
        else print "owner can not read"
© www.soinside.com 2019 - 2024. All rights reserved.