2016-08-12 91 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