2016-08-12 38 views
4

当我在Windows上使用removeDirectoryRecursive时,PermissionDenied类型的IOException引发了消息“removeDirectoryRecursive:permission denied”。我确实拥有删除目录所需的权限。对于具有相同内容的目录,Linux不会发生此问题。Haskell removeDirectoryRecursive:在Windows上拒绝的权限

+0

不能删除一个目录,这不是空... –

+1

@MarcB:这就是为什么'removeDirectoryRecursive'是_recursive_:删除目录之前,递归删除所有内容。我知道问题所在,并且我在这里分享了解决方案[问答样式](https://stackoverflow.com/help/self-answer)来帮助其他可能遇到同样问题的人。 – Ruud

回答

3

如果要删除的目录包含只读文件,则删除这些文件将在Windows上失败,但在Linux上将失败。

存在removePathForcibly,但它只被引入very recently

所以这里有一个帮助函数递归地使文件可写。在致电removeDirectoryRecursive之前可以使用它。

import Control.Monad (forM_, when) 
import System.FilePath ((</>)) 
import qualified System.Directory as FileSystem 

-- Recursively makes all files and directories in a directory writable. 
-- On Windows this is required to be able to recursively delete the directory. 
makeWritableRecursive :: FilePath -> IO() 
makeWritableRecursive path = do 
    permissions <- FileSystem.getPermissions path 
    FileSystem.setPermissions path (FileSystem.setOwnerWritable True permissions) 
    isDirectory <- FileSystem.doesDirectoryExist path 
    when isDirectory $ do 
    contents <- FileSystem.listDirectory path 
    forM_ [path </> item | item <- contents] makeWritableRecursive