태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

안드로이드의 파일 입/출력에 필요한 경로를 얻는 방법 총정리!

2010.12.31 12:21


애플리케이션을 제작하다 보면 파일을 입/출력 기능을 구현해야 하는 경우가 있습니다. 파일 입/출력을 수행하려면 파일의 경로를 꼭 알아야 하는데, 안드로이드에서 파일을 저장할 수 있는 경로는 다양합니다. 

가장 크게 애플리케이션 데이터가 저장되는 영역(일반적으로 '내부 저장소(Internal Storage)'라 불림)와 사진, 비디오, 데이터 등을 저장하는 영역(일반적으로 '외부 저장소(External Storage)(주1)'라 불림)으로 나뉠 수 있으며, 각 영역별로 다시 캐시 데이터가 저장되는 영역, 데이터베이스가 저장되는 영역 등으로 나뉩니다.

(주1) 외부 저장소는 사용자 데이터(사진, 동영상, 등)이 저장되는 영역입니다. 일반적으로 이는 단말기의 외장 SD카드를 지칭하지만, 단말기에 따라서는 이 영역이 외장 SD카드가 아닌 단말기 내부에 탑재되어 있는 경우도 있었습니다. (넥서스S가 이에 해당) 또는, 단말기 내에 탑재된 외장 메모리 영역 외에 별도의 SD카드도 지원하는 단말기도 존재합니다. (갤럭시S가 이에 해당)

내부 저장소는 각 애플리케이션에서만 데이터를 읽고 쓸 수 있지만, 외부 저장소에는 특정 애플리케이션에서만 사용하는 애플리케이션 고유 영역과 공용 영역이 각각 존재합니다. 애플리케이션 고유 영역에는 각 애플리케이션에서 사용하는 데이터를 저장하며, 이 영역에 저장된 내용은 애플리케이션이 삭제될 때 같이 삭제됩니다. 

공용 영역에는 사진, 비디오, 기타 파일 등을 저장하며 애플리케이션의 삭제에 영향을 받지 않습니다. 하지만, 외부 저장소에 저장된 데이터는 애플리케이션 고유 영역에 저장되어 있더라도 다른 애플리케이션에서 해당 데이터에 접근하는 것이 가능합니다.

각 영역의 경로가 필요할 때마다 해당 경로를 직접 써서 사용할 수도 있겠지만, 번거롭기도 하고 각 유형에 해당하는 경로를 그 때마다 찾아봐야 하므로 시간도 많이 소요됩니다. 이러한 이유로 안드로이드에서는 데이터가 저장되는 주요 경로를 간편하게 얻는 메서드를 제공합니다. 

내부 저장소

1. 캐시(Cache) 저장 영역
캐시 디렉터리에는 애플리케이션에서 필요한 임시 파일들이 저장됩니다.

API
File Context.getCacheDir()
내부 저장소의 캐시 디렉터리 경로를 반환합니다.

내부 저장소의 캐시 디렉터리 경로는 다음과 같이 구성됩니다.

/data/data/[패키지 이름]/cache

패키지 이름이 com.androidhuman.app 일 경우, 이 애플리케이션의 캐시 디렉터리 경로는 다음과 같습니다.

/data/data/com.androidhuman.app/cache

2. 데이터베이스(Database) 파일
애플리케이션에서 사용하는 데이터베이스 파일들이 저장됩니다.

API
File Context.getDatabasePath(String name)
데이터베이스 파일의 경로를 반환합니다. 인자로 데이터베이스 파일의 이름을 넘겨줍니다.

데이터베이스 파일이 저장되는 경로는 다음과 같이 구성됩니다.

/data/data/[패키지 이름]/databases

패키지 이름이 com.androidhuman.app 일 경우, 데이터베이스 파일은 다음 경로에 저장됩니다.

/data/data/com.androidhuman.app/databases

3. 일반 파일 저장 영역
데이터베이스와 캐시를 제외한 애플리케이션에서 사용하는 일반 파일이 저장되는 영역입니다. 이 경로는 Context.openFIleOutput(String, int)를 사용하여 생성되는 파일이 저장되는 경로와 동일합니다.

API
File Context.getFilesDir()
애플리케이션에서 사용하는 일반 파일들이 저장되는 경로를 반환합니다.

파일이 저장되는 경로는 다음과 같이 구성됩니다.

/data/data/[패키지 이름]/files

패키지 이름이 com.androidhuman.app 일 경우, 일반 파일은 다음 경로에 저장됩니다.

/data/data/com.androidhuman.app/files

애플리케이션에서 사용하는 각 일반 파일들의 경로를 가져오려면 다음 메서드를 사용합니다.

API
File Context.getFileStreamPath(String name)
일반 파일이 저장된 공간에서 특정 이름을 가지는 파일의 경로를 반환합니다. 인자로 확장자를 포함한 파일 이름을 넘겨줍니다.

파일의 경로는 다음과 같이 구성됩니다.

/data/data/[패키지 이름]/files/[파일이름]

패키지 이름이 com.androidhuman.app 이고 파일 이름이 filename.ext일 경우, 파일의 경로는 다음과 같습니다.

/data/data/com.androidhuman.app/files/filename.ext


외부 저장소-공용 영역

1. 최상위 경로 얻기
외부 저장소(일반적으로 SD카드)의 최상위 경로를 의미합니다.

API
static File Environment.getExternalStorageDirectory()
외부 저장소의 최상위 경로를 반환합니다.

2.2 (Froyo) 이상을 기준으로 반환되는 최상위 경로는 일반적으로 다음과 같습니다.

/mnt/sdcard


2. 특정 데이터를 저장하는 영역
여러 애플리케이션에서 공용으로 사용할 수 있는 데이터들을 저장합니다. 데이터의 유형에 따라 별도의 디렉터리를 사용합니다.

API
static File Environment.getExternalStoragePublicDirectory(String type)
데이터 유형에 따른 외부 저장소의 저장 공간 경로를 반환합니다. 인자로 디렉터리의 유형을 넘겨줍니다.

안드로이드에서는 총 7개 데이터 유형에 대한 표준 저장 경로를 제공합니다. Environment.getExternalStoragePublicDirectory()의 인자로 넘겨줄 수 있는 인자 및 각 인자의 경로는 다음과 같습니다.

 인자명 설명   경로
 Environment.DIRECTORY_ALARMS   알람으로 사용할 오디오 파일을 저장합니다.  /mnt/sdcard/Alarms
 Environment.DIRECTORY_DCIM  카메라로 촬영한 사진이 저장됩니다.  /mnt/sdcard/DCIM
 Environment.DIRECTORY_DOWNLOADS  다운로드한 파일이 저장됩니다.  /mnt/sdcard/Download
 Environment.DIRECTORY_MUSIC  음악 파일이 저장됩니다.  /mnt/sdcard/Music
 Environment.DIRECTORY_MOVIES  영상 파일이 저장됩니다.  /mnt/sdcard/Movies
 Environment.DIRECTORY_NOTIFICATIONS  알림음으로 사용할 오디오 파일을 저장합니다.  /mnt/sdcard/Notifications
 Environment.DIRECTORY_PICTURES  그림 파일이 저장됩니다.  /mnt/sdcard/Pictures
 Environment.DIRECTORY_PODCASTS  팟캐스트(Poacast) 파일이 저장됩니다.  /mnt/sdcard/Podcasts

이 영역에 데이터를 저장하기 전에, 해당 디렉터리가 존재하는지 필히 확인해야 합니다. 이를 확인하기 위해 File.mkdirs()를 사용하여 디렉터리가 없을 경우 새 디렉터리를 생성합니다. 디렉터리가 존재하지 않을 경우 FileNotFoundException이 발생합니다.

외부 저장소-애플리케이션 고유 영역

1. 특정 데이터를 저장하는 영역
애플리케이션 고유 영역에도 공용 영역과 마찬가지로 각 데이터 유형별로 데이터를 저장하는 표준 디렉터리를 제공합니다. 

API
File Context.getExternalFilesDir(String type)
애플리케이션 고유 영역의 데이터 유형에 따른 외부 저장소의 저장 공간 경로를 반환합니다. 인자로 디렉터리의 유형을 넘겨줍니다.

각 경로의 역할은 공용 영역과 동일합니다.

 인자명 경로 
 Environment.DIRECTORY_ALARMS  /mnt/sdcard/Android/data/[패키지 이름]/files/Alarms
 Environment.DIRECTORY_DCIM   /mnt/sdcard/Android/data/[패키지 이름]/files/DCIM
 Environment.DIRECTORY_DOWNLOADS   /mnt/sdcard/Android/data/[패키지 이름]/files/Downloads
 Environment.DIRECTORY_MUSIC   /mnt/sdcard/Android/data/[패키지 이름]/files/Music
 Environment.DIRECTORY_MOVIES   /mnt/sdcard/Android/data/[패키지 이름]/files/Movies
 Environment.DIRECTORY_NOTIFICATIONS   /mnt/sdcard/Android/data/[패키지 이름]/files/Notifications
 Environment.DIRECTORY_PICTURES   /mnt/sdcard/Android/data/[패키지 이름]/files/Pictures
 Environment.DIRECTORY_PODCASTS   /mnt/sdcard/Android/data/[패키지 이름]/files/Podcasts
 null   /mnt/sdcard/Android/data/[패키지 이름]/files


2. 캐시 데이터를 저장하는 영역
애플리케이션에서 사용하는 임시 데이터를 외부 저장소에 저장합니다.

API
File Context.getExternalCacheDir()
외부 저장소의 캐시 디렉터리를 반환합니다.

외부 저장소의 캐시 저장 경로는 일반적으로 다음과 같이 구성됩니다.

/mnt/sdcard/Android/data/[패키지 이름]/cache

패키지 이름이 com.androidhuman.app 일 경우, 캐시 저장 경로는 다음과 같습니다.

/mnt/sdcard/Android/data/com.androidhuman.app/cache
저작자 표시 비영리 변경 금지
신고

커니 데이터 관리 , , , , , ,

  1. 안녕하세요, Jyui입니다.
    먼저 좋은 글을 공유해주셔서 감사합니다 ^^ 덕분에 깔끔하게 정리되었습니다.

    다름이 아니라 제 블로그인 http://jyui.tistory.com/464에 다음에 같은 것을 또 어렵에 찾지 않을 목적으로^^ 이 포스트의 링크를 적어놨습니다.
    혹 문제가 된다면 알려주세요.

    다시 한번 좋은 정보 공유 감사합니다 ^^

  2. Blog Icon
    songahlee

    정리를 너무 잘해주셔서 도움이 많이 되네요.
    감사합니다.
    출처 밝히고 제 블로그에 퍼갈께요~^^

  3. Blog Icon
    ohkst

    엄청난 도움이 되었습니다!!
    감사합니다.

  4. Blog Icon
    하바이트

    제가 앱 내부에서 AsyncTask로 video 파일을 삭제했는데 MediaStore.Video.Media.EXTERNAL_CONTENT_URI.의 값이 변경되지 않습니다.
    디바이스 자체앱 갤러리로 보면 섬네일과 파일정보가 보이지만, FILE을 누르면 데이터를 로드할수 없다고하고 제가 생각했을때는 앱 자체적으로 일정시간마다 실데이터와 싱크를 한번한뒤 갤러리의 값이 바뀌는것 같습니다. 하지만 저는 앱에서 FILE을 지웠을때 바로 앱에다가 데이터가 바꼈으니 정보를 갱신하라고 notifyDataSetChanged()같은 함수를 사용하고 싶은데 도저히 못찾겠습니다. 도움을 주실수 있을런지요. 아무리 구글링 해도 답이 안나오네요.
    http://stackoverflow.com/questions/8311751/delete-databases-folder-internal-storage 여기도 저와 같은 문제가 발생한듯 하지만 답을 못찾겠어요 ㅠㅠㅠㅠ