2012-08-27 3 views
0

디렉토리 계층 구조를 만들고 내 자산에서 새로 생성 된 디렉토리로 파일을 복사하려고합니다. stackoverflow에서 제공되는 코드 샘플을 사용했지만 어디에도 없습니다. 본질적으로 제 코드는 다음과 같습니다 :안드로이드 파일 시스템의 디렉토리 및 파일 생성

InputStream in = getAssets.open(mydb.sqlite); 
File dir = new File("/data/data/my.package/databases/"); 

dir.mkdirs(); 
out = new FileOutputStream("/data/data/my.package/databases/mydb.sqlite"); 
while ((len = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, len); 
} 
out.flush(); 
out.close(); 
in.close 

이것은 모두 첫 번째 실행시 주요 활동 내에서 이루어 지므로 물론 한 번만 수행해야합니다. 코드가 실행되기 전에 존재하는 유일한 디렉토리는/data /입니다. 예, 데이터베이스 파일입니다. 그러나 파일을 복사하고 데이터베이스 코드로 아직 파일에 액세스하지 않았으므로이 시점에서 중요하지 않습니다.

코드는 예외를 throw하지 않으며 dir.mkdirs()는 true를 반환합니다. 그럼에도 불구하고 디렉터리가 만들어지지 않고 파일이 복사되지 않습니다. 여러 위치, FWIW에서 제안 된대로 내 매니페스트에 WRITE_EXTERNAL_STORAGE에 대한 사용 권한 줄을 추가했습니다. 나는 코드를 단계별로 진행할 수 있으며 모든 것이 잘된 것처럼 보입니다. 물론 그렇지 않습니다.

여기에서 무엇을 찾고 싶습니까? 파일 사용 권한 문제? 왜 코드는 모든 것이 있다고 생각합니까 (즉, 복사 코드에 도달하면 FileNotFoundException을 발생시키지 않습니다). 실제로 파일 시스템에는 아무 것도 없습니까?

편집 : 내가 배운 내용은 다음과 같습니다. getDir()은 /data/data/my.package/app_*에 디렉토리를 만듭니다. 디렉터리 이름에이 접두사를 사용하는 이유를 잘 모릅니다. 데이터베이스/파일 /과 같은 표준 위치에 뭔가를 넣어야하는 경우에는 작동하지 않습니다.

답변

1

/data/data가 내부 저장소이기 때문에 openFileOutput을 대신 사용하고 파일 핸들을 얻기 위해 Android API 만 사용해야합니다. 참조 : http://developer.android.com/guide/topics/data/data-storage.html#filesInternal

편집 : 당신이 당신의 getDir와 디렉토리 ('데이터베이스', MODE_PRIVATE)를 만들고 거기에 파일을 생성 할 수 있도록 /data/data/my.package이 openFileOutput/getDir에 의해 처리됩니다.

Edit2가 : getDir 문서에서 는 :

이 디렉토리에 생성하고 파일에 액세스하기 위해 반환 된 파일 객체를 사용할 수 있습니다. 이에 추가

+2

, 당신은, openFileOutput()는 파일 이름 매개 변수에 경로 구분에 동의하지 않는 문서에 따르면/데이터/데이터/ 디렉토리 – nandeesh

+0

에 쓸 수있는 WRITE_EXTERNAL_STORAGE 권한이 필요 없어요. getDir()에는 같은 제한이 있습니다. SQLiteOpenHelper가 데이터베이스를 찾을 것으로 기대하기 때문에 /data/data/my.package/databases/ 디렉토리를 설정해야합니다. 내가 놓친 게 있니? –

관련 문제