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

How can I check file permissions of a Linux file using Haskell?

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

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

FileModeCMode 的类型别名,是一个 32 位数字。该包还包含常量,如 ownerReadModeownerWriteModeownerExecuteModegroupReadModegroupWriteModegroupExecuteModeotherReadModeotherWriteModeotherExecuteMode

您可以使用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 将检查文件模式和 return 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"