2016-08-12 2 views
4

Windows에서 removeDirectoryRecursive을 사용하는 경우 PermissionDeniedIOException에 "removeDirectoryRecursive : permission denied"메시지가 표시됩니다. 디렉토리를 제거하는 데 필요한 권한이 있습니다. 동일한 내용을 가진 디렉토리의 경우 Linux에서는이 문제가 발생하지 않습니다.Haskell removeDirectoryRecursive : Windows에서 사용 권한이 거부되었습니다.

+0

당신이 비어 있지의 디렉토리를 제거 할 수 없습니다 ... –

+1

@MarcB : 그것은 removeDirectoryRecursive'이 _recursive_ 왜'이다 : 그것은 재귀 적으로 디렉토리를 삭제하기 전에 모든 내용을 삭제합니다. 문제가 무엇인지 알았고 같은 문제가 발생할 수있는 다른 사람들을 돕기 위해 해결책을 여기에서 공유했습니다. [Q & A 스타일] (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 
관련 문제