gpt4 book ai didi

haskell - 将文件读取为字节串并将此字节串写入文件 : issue on a network drive

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

考虑以下简单的 Haskell 程序,它将文件作为字节串读取并写入文件 tmp.tmp从这个字节串:

module Main
where
import System.Environment
import qualified Data.ByteString.Lazy as B

main :: IO ()
main = do
[file] <- getArgs
bs <- B.readFile file
action <- B.writeFile "tmp.tmp" bs
putStrLn "done"

它被编译成一个名为 tmptmp 的可执行文件.

我的电脑上有两个硬盘: C驱动器和 U驱动器,这个是网络驱动器,这个网络驱动器是离线的。

现在,让我们试试 tmptmp .

当我从 C 运行它时, 这里没有问题;我在下面运行了两次,第一次使用 C 上的文件第二次使用 U 上的文件:
C:\HaskellProjects\imagelength> tmptmp LICENSE
done

C:\HaskellProjects\imagelength> tmptmp U:\Data\ztemp\test.xlsx
done

现在我从 U 运行它, 文件位于 C开车,没问题:
U:\Data\ztemp> tmptmp C:\HaskellProjects\imagelength\LICENSE
done

当我从 U 运行它时出现问题与 U 上的文件驾驶:
U:\Data\ztemp> tmptmp test.xlsx
tmptmp: tmp.tmp: openBinaryFile: resource busy (file is locked)

如果在我的程序中我使用严格的字节串而不是惰性字节串(通过将 Data.ByteString.Lazy 替换为 Data.ByteString ),则不再出现此问题。

我想明白这一点。有什么解释吗? (我特别想知道如何解决这个问题但仍然使用惰性字节串)

编辑

更准确地说,这个程序仍然存在问题:
import qualified Data.ByteString as SB
import qualified Data.ByteString.Lazy as LB

main :: IO ()
main = do
[file] <- getArgs
bs <- LB.readFile file
action <- SB.writeFile "tmp.tmp" (LB.toStrict bs)
putStrLn "done"

虽然问题消失了:
  bs <- SB.readFile file
action <- LB.writeFile "tmp.tmp" (LB.fromStrict bs)

看起来导致问题的关键是 readFile 的懒惰。 .

最佳答案

根据最新的 Data.ByteString.Lazy docs :

Using lazy I/O functions like readFile or hGetContents means that the order of operations such as closing the file handle is left at the discretion of the RTS.


使用离线网络驱动器给出的示例可能会导致 RTS 从 readFile 继续而不关闭文件。具有几乎相同示例的文档说

When writeFile is executed next, [tmp.tmp] is still open for reading and the RTS takes care to avoid simultaneously opening it for writing, instead returning the error.


据我所知, 没有解决办法在 Data.ByteString.Lazy — 文档中建议您的解决方案(使用严格读取)和其他包。有时读写同一个文件可以工作,但你不能保证。

关于haskell - 将文件读取为字节串并将此字节串写入文件 : issue on a network drive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44608214/

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