[Cocoa] 파일이나 폴더를 휴지통으로 이동

보통 파인더에서는 파일을 삭제하는 대신 '휴지통으로 이동' 이라는 방법을 제공한다. 휴지통에 버려 뒀다가 실수로 삭제한 파일을 다시 복원시키기 위함이다.

Cocoa 에서 파일을 삭제 할 때는 NSFileManager의 removeItemAtPath:error 메시지를 이용하면 된다. 하지만 이렇게 삭제를 해 버리면 휴지통으로 이동하는 것이 아니라 파티션 테이블에서 삭제가 되어버리기 때문에 복원이 불가능하다. 그래서 안전한 삭제를 위해 '휴지통으로 이동' 기능을 구현하는 것도 필요 할 때가 있다.

'휴지통으로 이동' 기능은 NSWorkspace에서 제공하는 performFileOperation:source:...  메시지를 이용할 수 있다.

아래 코드는 NSString 클래스 오브젝트인 path 라는 경로에 있는 파일이나 폴더(디렉토리)를 휴지통으로 이동시키는 코드이다.
[[NSWorkspace sharedWorkspace] 
    performFileOperation:NSWorkspaceRecycleOperation
                  source:[path stringByDeletingLastPathComponent]
             destination:@""
                   files:[NSArray arrayWithObject:[path lastPathComponent]]
                     tag:nil];
오퍼레이션으로 NSWorkspaceRecyleOperation이라는 명령이 파인더(Finder)에서 사용하는 '휴지통으로 이동' 과 동일한 기능을 하도록 수행한다.

NSString의 stringByDeletingLastPathComponent 는 문자열로 이루어긴 경로에서 마지막 컴포넌트(파일이나 폴더) 이름을 제거한 문자열을 돌려준다. 이는 삭제할 것이 어디에 있는지를 알려주기 위함이다.

NSString의 lastPathComponent는 문자열 경로에서 가장 마지막 컴포넌트(파일이나 폴더. 즉, 위에서 제거했던 것) 문자열을 돌려준다. 즉 위에서 source에 해당하는 곳의 특정 파일을 삭제하기 위함이다. 물론 files에서 볼 수 있듯이 NSArray를 이용해 복수의 파일이나 폴더를 지정하는 것도 가능하다.

이 방법 말고도 휴지통의 경로를 알아내서 파일을 이동시켜 버리는 것도 방법이긴 하다. 하지만 이렇게 하면 자동 복구가 불가능하다. 왜냐하면 원래 파일이 위치하던 곳을 알려주지 않았으니까... :-(

참고링크: NSWorkspace Class Reference

댓글

이 블로그의 인기 게시물

버전(Version)을 제대로 이해하기

소수점 제거 함수 삼총사 ceil(), floor(), round()