Я пытаюсь прочитать текст всех файлов в папке со следующим кодом:
readALine :: FilePath -> IO ()
readALine fname = do
putStr . show $ "Filename: " ++ fname ++ "; "
fs <- getFileSize fname
if fs > 0 then do
hand <- openFile fname ReadMode
fline <- hGetLine hand
hClose hand
print $ "First line: " <> fline
else return ()
Однако некоторые из этих файлов являются двоичными. Как я могу узнать, является ли данный файл бинарным? Я не смог найти такую функцию в https://hoogle.haskell.org/?hoogle=binary%20file
Спасибо за вашу помощь.
Редактировать: Под двоичным я подразумеваю, что файл содержит непечатаемые символы. Я не уверен в правильности названия этих файлов.
Я установил UTF8-строку и изменил код:
readALine :: FilePath -> IO ()
readALine fname = do
putStr . show $ "Filename: " ++ fname ++ "; "
fs <- getFileSize fname
if fs > 0 then do
hand <- openFile fname ReadMode
fline <- hGetLine hand
hClose hand
if isUTF8Encoded (unpack fline) then do
print $ "Not binary file."
print $ "First line: " <> fline
else return ()
else return ()
Теперь это работает, но при обнаружении «двоичного» исполняемого файла (называемого esync.x) возникает ошибка в hGetLine hand
выражении:
"Filename: ./esync.x; "firstline2.hs: ./esync.x: hGetLine: invalid argument (invalid byte sequence)
Как проверить символы из самого дескриптора файла?