如何判断文件所有者是否具有写/读/可执行权限?
我找到了
FileMode
http://hackage.haskell.org/package/base-4.10.0.0/docs/System-Posix-Types.html#t:FileMode,但我似乎找不到一种简单的方法来确定权限。
嗯
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"