gpt4 book ai didi

haskell - 使用 Haskell 重命名文件时如何确保目标文件不存在,以避免覆盖它?

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

我想在 Haskell 中重命名一个文件,而不覆盖已经存在的文件。如果目标文件存在,我想在我的代码中处理它(通过在文件名中附加一些内容)。

renameFile的描述来自System.Directory 说:

renameFile old new changes the name of an existing file system object from old to new. If the new object already exists, it is atomically replaced by the old object. Neither path may refer to an existing directory.

是否有任何现有模块或命令可以让我重命名而不覆盖?

我知道我可以自己进行检查。如果有一个由有经验的人编写的函数,我会感觉好很多。被覆盖的文件将永远消失。

更新

我想通过来自 EXIF(类似于 jhead)的创建数据或标准化为照片拍摄时区的文件系统时间戳来重命名照片、视频、实时照片。可能是这样两张照片是在完全相同的时间拍摄的,并且最终会具有相同的名称:2017-01-12 – 11-12-11.jpg。这绝不能发生。第二张照片的名称应类似于 2017-01-12 – 11-12-11a.jpg

最佳答案

POSIX 能够创建新文件:通过 open()O_EXCL 标志自动检查文件是否存在,只有在不存在时才创建它。 。这可以让您避免更明显的实现中的竞争条件,其中两个进程可能会在其中任何一个进程创建文件之前检查该文件是否不存在,从而导致一个进程覆盖另一个进程的文件。这在这里可以有所帮助:其想法是在目标上独占创建一个空文件,然后仅在独占创建成功时才使用重命名覆盖它。如果独占创建失败,则另一个进程已经创建了该文件。这在 Haskell 的 unix package 中有所暴露。 ,通过openFd function ,要么成功,要么抛出 IOException。可以这样使用:

module RenameNoOverwrite where

import Control.Exception
import Control.Monad
import Data.Bits
import System.Directory
import System.Posix.Files
import System.Posix.IO

renameFileNoOverwrite :: FilePath -> FilePath -> IO Bool
renameFileNoOverwrite old new = do
created <- handle handleIOException $ bracket createNewFile closeFd $ pure $ pure True
when created $ renameFile old new
return created

where
createNewFile = openFd new WriteOnly (Just defaultMode) defaultFileFlags {exclusive = True}
defaultMode = ownerReadMode .|. ownerWriteMode .|. groupReadMode .|. otherReadMode

handleIOException :: IOException -> IO Bool
handleIOException _ = return False

关键部分是 {exclusive = True} 选项,它在对 open() 的结果调用上设置 O_EXCL 标志。

Windows 具有类似的功能,通过 CREATE_NEW 标志公开到 CreateFileMoveFileEx 还有一个 MOVEFILE_REPLACE_EXISTING 标志看起来它可能很有用,但我从未使用过它,而且文档对我来说也不是 100% 清楚。这些都在 Haskell 的 Win32 package 中公开。 .

不幸的是,目前似乎没有一种可移植的方法来做到这一点。

关于haskell - 使用 Haskell 重命名文件时如何确保目标文件不存在,以避免覆盖它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41640151/

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