2011-11-30 4 views
9

구아바 10+에서 Google은 Files.deleteDirectoryContents()을 사용하지 않습니다. JavaDoc의 답변 :Guava에서 Files.deleteDirectoryContents()가 사용되지 않는 이유는 무엇입니까?

더 이상 사용되지 않습니다. 이 방법은 기호 링크 검색이 불량하고 조건으로 인해 어려움을 겪습니다. 이 기능은 이 rm -rf 또는 del/s와 같은 운영 체제 명령으로 포설 될 때까지만 적절하게 지원 될 수 있습니다. 이 방법은 구아바에 구아바에서 제거 될 예정입니다 것은 11.0

내가 경쟁 조건이 이유에 대해 혼란 스러워요 놓습니다. 나는이 방법을 사용하는 것이 실제로 유용하며 운영체제에 좋지 않은 해결책을 내고 있다고 생각한다. 저자가 왜이 결정을했는지 공유 할 수 있습니까?

+0

더 명확히 말하면 경쟁 조건 문제는 주요한 버그가 아니라고 생각합니다. 'ArrayList'와 같은 많은 라이브러리들은 쓰레드에 안전하지 않거나 경합 조건을 가지고 있습니다. 'File.remove'조차도 같은 문제가 있습니다. 그러나 그들은 모두 문서화되어 있습니다. 그래서 나는 그들이 문서화 된 것을 왜 사용하지 않기로 결정했는지에 관한 문서가 이미 말한 것 외에는 대답을 듣기를 희망했다. –

+1

이 레이스 조건과 일반적인 비 스레드 안전 클래스 간의 차이점은 "수정"이 없다는 것입니다. 반대로 잠금 객체를 동기화하여 스레드 안전 클래스가 아닌 클래스로 Java 스레드 안전 문제를 해결할 수 있습니다. 단순히 사람들이 기대하는 것을 할 수없는 방법은 나쁜 방법입니다. –

+0

좋은 지적입니다. 감사. –

답변

5

경쟁 조건이있는 이유에 대해 혼란 스럽습니다.

예를 들어 한 스레드가 Files.deleteDirectoryContents()을 호출하고 두 번째 스레드 (또는 외부 프로세스)가 동시에 디렉터리에 새 파일을 생성한다고 가정합니다.

전화를 받았을 때 다시 전화를 걸면 디렉토리가 비어있을 수 있습니까? 아니!

어쨌든이 방법의 기능이 유용하다는 것을 알게되면 결함에도 불구하고 코드 복사본을 가져 와서 응용 프로그램에 임베드 할 수 있습니다. (구아바 소스 코드 라이센스를 확인하고 준수하는지 확인하십시오.)

저자가이 결정을 한 이유를 공유 할 수 있습니까?

나는 이미 가지고 있다고 생각합니다. 지원 중단 통지를 참조하십시오. 더 많은 정보가 필요하면 문제 추적기와 구아바 토론 그룹을 검색해보십시오. 토론 그룹에 정중하게 묻는 것도 시도 할 수 있습니다. 그러나 의제가 마음을 바꾸는 것이라면 성공할 수 있을지 의심 스럽습니다.

+4

OS에 포격하는 것과 같은 것이 사실 일까? – anders

+0

+1 OS에 대한 포격이 사실이 아니겠습니까? 나는 라이브러리가 쓰레드에 안전하지 않다면 문서화되어야하고 개발자가 올바르게 사용하는지 확인해야한다고 생각한다. –

+0

@Stephen C, 나는 몸의 마음을 바꾸려고하지 않습니다. 왜 이것이 권장되지 않는지에 대한 좋은 이유가 있다고 확신합니다. 나는 단지 경쟁 조건 이외에 아마도 이것을해야만하는 문제가 있다고 생각했습니다. 하지만 경쟁 조건을 가진 라이브러리가 많이 있습니다. 더 나은 이유가 있다고 생각했습니다. –

5

경쟁 조건은 잠재적으로 "디렉토리가 비어 있지 않을 수도 있습니다"보다 좋지 않습니다. 이는 부분적으로 잘못된 심볼 링크 감지로 인한 것입니다. 이 코드를 고려하십시오 directory는 검사 기간 동안 일반 디렉토리하지만 이후 /에 심볼릭 링크

// Symbolic links will have different canonical and absolute paths 
if (!directory.getCanonicalPath().equals(directory.getAbsolutePath())) { 
    return; 
} 
... delete its contents ... 

경우, deleteDirectoryContents 행복하게 전체 파일 시스템을 닦아하려고합니다.

아마도 해결 방법이 있지만 찾을 수 없습니다. 잠재적 인 보안 버그에 대한 임시 수정을하는 것은 무섭습니다.

1

깨진 심볼 링크 검색에 대한 자세한 내용은 these bugs filed by users을 참조하십시오.

즉, 해당 디렉토리에 대한 표준 경로를 제공하지 않으면 디렉토리를 초기화 할 수 없습니다. /tmp/some/other/directory에 대한 링크 인 경우 deleteDirectoryContents/tmp/mytempdirectory을 지울 수 없습니다. 어쩌면 여기서도 가능한 해결 방법이있을 수 있지만 우리는 손을 던졌습니다.

1

진지한가?

예를 들어, 하나의 스레드가 Files를 호출한다고 가정 해보십시오.deleteDirectoryContents()와 두 번째 스레드 (또는 외부 프로세스)는 동시에 디렉토리에 새 파일을 만듭니다. 전화를 받았을 때 디렉토리가 비어있을 수 있습니까? 아니!

그리고 다른 프로세스는 디렉토리에서 작동합니까? 해결할 수 없으므로 단순히 처리 할 수 ​​없기 때문에 트랜잭션을 처리하면 안됩니다. 그리고 누군가가 루트에 대한 심볼릭 링크를 만들어서 파일 시스템 전체를 지울 수 있다는 주장은 - 파일 시스템에 대한 접근 권한을 부여해서는 안된다는 말입니까? 그리고 루트와 같은 작업을 실행중인 경우 수행중인 작업을 알아야합니다. 파일 시스템에서 파일을 전혀 삭제하지 못하게하는 것은 위험합니다 !!! 구아바의 저자가 그런 바보 같은 문제를 해결한다면 나는 다른 도서관을 사용할 것이다.

관련 문제