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

これはすべて、最初の起動時にメイン アクティビティ内で実行され、もちろん 1 回だけ実行する必要があります。コードを実行する前に存在する唯一のディレクトリは /data/ です。はい、これはデータベース ファイルですが、ファイルをコピーしただけで、データベース コードでアクセスしようとしていないので、この時点では問題ありません。

コードは例外をスローせず、dir.mkdirs() は true を返します。とにかく、ディレクトリは作成されず、ファイルはコピーされません。いくつかの場所で提案されているように、マニフェストに WRITE_EXTERNAL_STORAGE の権限行を追加しました.FWIW. コードをステップ実行すると、すべて問題ないように見えます。しかし、もちろんそうではありません。

ここで何を探す必要がありますか? ファイルのパーミッションの問題? コードはすべてがそこにあると考えているのに (つまり、コピー コードに到達したときに FileNotFoundException をスローしない)、実際にはファイル システムに何もないのはなぜですか?

編集:これが私が学んだことです。getDir() は、/data/data/my.package/app_* にディレクトリを作成します。ディレクトリ名にこのプレフィックスを使用する理由がわかりません。データベース/またはファイル/などの標準的な場所に何かを置く必要がある場合、これは機能しません。

4

1 に答える 1

1

/data/data は内部ストレージであるため、代わりに openFileOutput を使用してください。Android API のみを使用して、そこでファイル ハンドルを取得する必要があります。参照: http://developer.android.com/guide/topics/data/data-storage.html#filesInternal

編集: /data/data/my.package は openFileOutput/getDir によって処理されるため、getDir('databases',MODE_PRIVATE) でディレクトリを作成し、そこにファイルを作成します。

Edit2: getDir ドキュメントから:

返された File オブジェクトを使用して、このディレクトリ内のファイルを作成およびアクセスできます。

于 2012-08-27T18:00:38.840 に答える