[英]Variable not in scope: getFileStatus turned into Failed to load interface for ‘System.Posix.Files.Common’ when importing the relevant package
我有從這里得到的以下代碼,我想要一個可以找到文件大小的函數
getFileSize :: String -> IO Integer
getFileSize path = do
stat <- getFileStatus path
return $ fromIntegral (hFileSize stat)
此代碼給出了錯誤“變量不在范圍內:getFileStatus”
我發現變量是Posix的一部分,所以我在新代碼中導入了文件:
import System.IO
import System.Posix.Types
import System.Posix.Files.Common
import System.Posix.Error
import System.Posix.Internals
getFileSize :: String -> IO Integer
getFileSize path = do
stat <- getFileStatus path
return $ fromIntegral (hFileSize stat)
現在我收到錯誤:錯誤:無法加載'System.Posix.Files.Common'的接口它是'unix-2.7.2.1'包中的一個隱藏模塊使用-v查看搜索的文件列表。
如果您查看unix-2.7.2.1
公開的模塊列表,則未列出System.Posix.Files.Common
。 正如錯誤消息所說,它是unix
包內部的一個隱藏模塊,因此您無法導入它,也不應該需要導入它。 System.Posix.Types
和System.Posix.Internals
。 您嘗試使用的getFileStatus
函數由System.Posix.Files
導出,因此您實際上只需要該導入。
你似乎也試圖用hFileSize :: Handle -> IO Integer
,但操作上的Handle
,而不是一個FileStatus
。 如果需要,您可以使用hFileSize
,但它需要一個Handle
而不是像getFileStatus
那樣的FilePath
/ String
,因此您只需要先打開一個句柄,例如:
import System.IO (IOMode(..), hFileSize, withFile)
getFileSize :: FilePath -> IO Integer
getFileSize path = withFile path ReadMode hFileSize
如果你仍然想為此使用unix
包,你想要的函數是fileSize :: FileStatus -> FileOffset
,它也是從System.Posix.Files
導出的:
import System.Posix.Files (getFileStatus, fileSize)
getFileSize :: FilePath -> IO Integer
getFileSize path = do
stat <- getFileStatus path
return $ fromIntegral (fileSize stat)
由於所有公共模塊都由System.Posix
導出,因此您也可以只從該模塊導入所有內容。 這正是您鏈接的原始代碼所做的,所以坦率地說,我不確定您為什么不直接復制它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.