一時ファイルから読み取ることができません

mjarosie

withSystemTempFileで取得した一時ファイルに書き込む外部プロセスを呼び出そうとしていますプロセスが終了した後、catそのファイルの内容を確認することはできopenFile: resource busy (file is locked)ますが、readFileを使用してそのファイルを読み取ろうとすると、アプリケーション自体がエラーで失敗します私はこの質問への回答の提案に従い、怠惰なバージョンのを使用しました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に頭を悩ませているので、アイデアが足りなくなったので、それが明白なことではないことを願っています。何が得られますか?

ミカエルF

このエラーはwithSystemTempFile、入力時にファイルがロックされるためです。代わりに(tempFilePathHandleコードで呼び出される)ハンドルを提供するため、次のようにハンドルを使用してファイルを読み取ることができます。

contents <- hGetContents tempFilePathHandle

編集

これは、GHCが内部でリーダーライターロックを実装して、開いたファイルと必要なアクセス許可を追跡するためです。リーダーライターロックは、1人のライター(排他的アクセス)または複数のリーダー(共有アクセス)のいずれかを許可します。

この場合、withSystemTempFile一時ファイルでライターロックをreadFile取得するため、必要なリーダーロックを取得できません(この場合も、ライターロックにより、GHCがそのファイルでリーダーロックを取得できなくなります)。

これは、ロックを実装するCコードへのリンクです。@luquiが以下のコメントで示唆しているように、特にGHCがOSレベルのロックを要求しないため、これはおそらく最適なソリューションではないため、のようなプロセスcatは引き続きファイルにアクセスして変更できます。ファイルの読み取り書き込みが予測しにくい結果を生成する怠惰なコンテキストでは、より意味があるかもしれません

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

tsファイルのenvファイルから読み取ることができません

分類Dev

C-末尾に改行がないファイルから読み取ることができません

分類Dev

ローカルホストからファイルを読み取ることができません

分類Dev

ソースファイルまたはディスクから読み取ることができません

分類Dev

rubyXLでxlsxファイルから読み取ることができません

分類Dev

FileInputstreamからロシア語の文字でファイル名を読み取ることができません

分類Dev

Pythonでファイルからデータを読み取ることができません

分類Dev

Javaはファイルから行を読み取ることができません

分類Dev

Javaのファイルからデータを読み取ることができません

分類Dev

Sparkを使用してHDFSからファイルを読み取ることができません

分類Dev

freadはファイルからオブジェクトを読み取ることができません

分類Dev

Pandasを使用したPython--URLからCSVファイルを読み取ることができません

分類Dev

Spark2.4.1はHDFSからAvroファイルを読み取ることができません

分類Dev

Objective-Cのmain.mからファイルを読み取ることができません

分類Dev

RStudioのxlsxファイルからデータを読み取ることができません

分類Dev

郵便配達員からファイルを読み取ることができません

分類Dev

ディレクトリからファイルを読み取ることができません

分類Dev

Cのテキストファイルから構造を読み取ることができません

分類Dev

ファイルを開くことができません!ファイルからの読み取り、c ++、xcode

分類Dev

pgAdminでCSVファイルを読み取ることができません。

分類Dev

cでファイル全体を読み取ることができません

分類Dev

Eclipseでファイルを読み取ることができません

分類Dev

iGraphpythonで.txtファイルを読み取ることができません

分類Dev

Pythonでファイルを読み取ることができません

分類Dev

ファイル全体を読み取ることができません

分類Dev

Laravel:構成ファイルを読み取ることができません

分類Dev

Ruby-yamlファイルを読み取ることができません

分類Dev

XCOPYは/ EXCLUDEファイルを読み取ることができません

分類Dev

Macは.imgファイルを読み取ることができません

Related 関連記事

  1. 1

    tsファイルのenvファイルから読み取ることができません

  2. 2

    C-末尾に改行がないファイルから読み取ることができません

  3. 3

    ローカルホストからファイルを読み取ることができません

  4. 4

    ソースファイルまたはディスクから読み取ることができません

  5. 5

    rubyXLでxlsxファイルから読み取ることができません

  6. 6

    FileInputstreamからロシア語の文字でファイル名を読み取ることができません

  7. 7

    Pythonでファイルからデータを読み取ることができません

  8. 8

    Javaはファイルから行を読み取ることができません

  9. 9

    Javaのファイルからデータを読み取ることができません

  10. 10

    Sparkを使用してHDFSからファイルを読み取ることができません

  11. 11

    freadはファイルからオブジェクトを読み取ることができません

  12. 12

    Pandasを使用したPython--URLからCSVファイルを読み取ることができません

  13. 13

    Spark2.4.1はHDFSからAvroファイルを読み取ることができません

  14. 14

    Objective-Cのmain.mからファイルを読み取ることができません

  15. 15

    RStudioのxlsxファイルからデータを読み取ることができません

  16. 16

    郵便配達員からファイルを読み取ることができません

  17. 17

    ディレクトリからファイルを読み取ることができません

  18. 18

    Cのテキストファイルから構造を読み取ることができません

  19. 19

    ファイルを開くことができません!ファイルからの読み取り、c ++、xcode

  20. 20

    pgAdminでCSVファイルを読み取ることができません。

  21. 21

    cでファイル全体を読み取ることができません

  22. 22

    Eclipseでファイルを読み取ることができません

  23. 23

    iGraphpythonで.txtファイルを読み取ることができません

  24. 24

    Pythonでファイルを読み取ることができません

  25. 25

    ファイル全体を読み取ることができません

  26. 26

    Laravel:構成ファイルを読み取ることができません

  27. 27

    Ruby-yamlファイルを読み取ることができません

  28. 28

    XCOPYは/ EXCLUDEファイルを読み取ることができません

  29. 29

    Macは.imgファイルを読み取ることができません

ホットタグ

アーカイブ