簡體   English   中英

變量不在范圍內:getFileStatus 在導入相關包時變成了 Failed to load interface for 'System.Posix.Files.Common'

[英]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.TypesSystem.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM