2017-07-31 74 views
1

我正在使用DevIL库来读取和写入图像。问题是我想覆盖文件,如果它已经存在。写入文件,但覆盖它,如果它存在与Devil和REPA

这里是我的代码:

(RGB v) <- runIL $ readImage "/foo/foo.png" 
let rotated = (computeS $ batman v) :: Array F DIM3 Word8 
runIL $ writeImage ("/foo/foo.png") (RGB rotated) 

我怎样才能做到这一点?我可以这样做吗?还是我必须考虑另一种方式?这是操作系统的东西?

我正在使用该文件作为临时图像,直到用户决定保存它(经过一些更改,如旋转它,扩展它等)。

+1

您是否尝试将图像保存到已存在的文件?那种情况发生了什么? – SwiftsNamesake

+0

如果这不起作用,您可以使用['doesFileExist'](http://hackage.haskell.org/package/directory-1.3.1.1/docs/System-Directory.html#v: doesFileExist)并在保存新文件之前将其删除。 – SwiftsNamesake

+0

当我将图像保存到已存在的文件时,程序退出并显示一条消息(“无法保存文件”)。我检查了DevIL源代码,我没有得到任何答案。我会尝试你所说的。谢谢! – Hamburguesa66

回答

0

如果库不会让您直接替换现有文件,则可以在保存新文件之前检查该文件是否存在doesFileExist并删除它。

replace = do  
    let fn = "path/to/image/file/..." 
    exists <- doesFileExist fn 
    when exists $ removeFile fn 
    runIL $ writeImage fn (RGB rotated) 
+0

我刚刚得到这个错误,“无法与实际类型'IO Bool'匹配预期类型'Bool'”。它会是什么? – Hamburguesa66

+0

我的不好。这是一个IO动作而不是一个纯函数,所以你必须提取这个值或者使用'whenM'之类的东西。我会编辑。 – SwiftsNamesake

相关问题