gpt4 book ai didi

haskell - 无法从临时文件中读取

转载 作者:行者123 更新时间:2023-12-04 00:20:27 25 4
gpt4 key购买 nike

我正在尝试调用一个外部进程,该进程写入一个我通过 withSystemTempFile 获得的临时文件.进程退出后,我能够 cat 该文件的内容,但应用程序本身失败并出现 openFile: resource busy (file is locked) 尝试时出现错误使用 readFile 读取该文件.我遵循了对 this 的回答中的建议问题并使用了 readFile 的惰性版本。这是一个示例代码:

module Main where

import Prelude hiding (readFile)
import System.Process (createProcess, shell)
import System.IO (Handle, hShow)
import System.IO.Temp (withSystemTempFile)
import System.IO.Strict (readFile)

main :: IO ()
main = withSystemTempFile "temp.txt" doSomeStuff
where
doSomeStuff :: FilePath -> Handle -> IO ()
doSomeStuff tempFilePath tempFilePathHandle = do
putStrLn tempFilePath
createProcess $ shell $ "echo \"test\" >> " ++ tempFilePath
getLine -- It's here just to stop program while I check that I can actually "cat" the temp file
-- here I'm able to cat the temp file
contents <- readFile tempFilePath -- here the command fails with /tmp/temp23900-0.txt: openFile: resource busy (file is locked)
putStrLn contents

我仍然在思考 Haskell,所以我希望它不是显而易见的东西,因为我已经没有想法了。给了什么?

最佳答案

withSystemTempFile 打开它为您创建的临时文件,因此您无需再次打开它。 readFile 使用文件名而不是文件句柄,因此您知道它一定是试图自己打开它。 readFile 的等效项,但对于您已经打开的文件是 hGetContents,因此要解决此问题,请将 readFile tempFilePath 替换为 hGetContents tempFilePathHandle(并相应地更新您的import)。

关于haskell - 无法从临时文件中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61177386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com