如果要刪除的目錄包含只讀文件,則刪除這些文件將在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
不能刪除一個目錄,這不是空... –
@MarcB:這就是爲什麼'removeDirectoryRecursive'是_recursive_:刪除目錄之前,遞歸刪除所有內容。我知道問題所在,並且我在這裏分享瞭解決方案[問答樣式](https://stackoverflow.com/help/self-answer)來幫助其他可能遇到同樣問題的人。 – Ruud