5

ファイルを SD カードに書き込もうとすると、java.io.FileNotFoundException: /filename (Read-only file system)例外が発生します。残念ながら、ここに投稿された多くの解決策はどれも役に立ちませんでした。アクセス許可を設定しましたが、外部ストレージは MEDIA_MOUNTED 状態です。これは問題のあるコードです:

Log.i("STORAGE", Environment.getExternalStorageState());
OutputStream fos = new FileOutputStream(Helpers.StripExtension(filePath) + ".blk");
fos.write(digest.getBytes());
fos.close();    

filePathファイルティッカーから来ます。私がやろうとしているのは、選択したファイルから読み取り、同じ名前、異なる拡張子、およびその中にいくつかのものを持つ別のファイルを保存することです。

マニフェスト:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="mypackagename"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="10"
    android:targetSdkVersion="15" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/title_activity_main"
        android:theme="@android:style/Theme.Black" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

ログキャット:

 10-25 18:24:34.330: I/FILEPATH(1989): /mnt/sdcard/Untitled.txt
 10-25 18:24:34.360: I/STORAGE(1989): mounted
 10-25 18:24:34.360: W/System.err(1989): java.io.FileNotFoundException: /mnt/sdcard/Untitled.blk (Read-only file system)
 10-25 18:24:34.360: W/System.err(1989):    at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method)
 10-25 18:24:34.360: W/System.err(1989):    at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232)
 10-25 18:24:34.360: W/System.err(1989):    at java.io.FileOutputStream.<init>(FileOutputStream.java:94)
 10-25 18:24:34.360: W/System.err(1989):    at java.io.FileOutputStream.<init>(FileOutputStream.java:165)
 10-25 18:24:34.360: W/System.err(1989):    at java.io.FileOutputStream.<init>(FileOutputStream.java:144)

avdではなく、実際のデバイスでこれを実行しています。デバイスの再起動とプロジェクトの再構築を試みました。OfficeSuite などのアプリケーションは、この場所に問題なく書き込むことができます。

デバイス: Android 2.3.7 (CyanogenMod 7) を搭載した ZTE Blade

4

3 に答える 3

0

これを試して:

File file = new File(filePath);
File parent = file.getParentFile();
if (!parent.exists() && !parent.mkdirs()) {
      return;
}

file = new File(Helpers.StripExtension(filePath) + ".blk");
OutputStream fos = new FileOutputStream(file);
fos.write(digest.getBytes());
fos.close();
于 2012-10-25T18:33:04.193 に答える
0

これを試して:

File file = new File(Helpers.StripExtension(filePath) + ".blk");
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
fos.write(digest.getBytes());
fos.close();

それでもうまくいかない場合は、元のファイル ( digest.getBytes()) からの読み取りに問題がある可能性があります。これにもう少しコードを投稿すると、そこから進むことができます

編集:

選択したディレクトリに書き込めない場合は、次のようなパスでテストしてみてください。

File file = new File(Environment.getExternalStorageDirectory() + "test_file.blk");

正常に動作するはずですが、使用しているディレクトリへの書き込み権限がない可能性があります。

于 2012-10-25T17:19:59.933 に答える
0

素晴らしい、私はしばらく前にまったく同じ問題を抱えていました。パス区切り文字 (またはそれが呼ばれるもの) がありません。

File file = new File(Environment.getExternalStorageDirectory() + "test_file.blk");

うまくいきませんでしたが、

File file = new File(Environment.getExternalStorageDirectory() + "/test_file.blk");

うまくいった

また:

FileWriter f = new FileWriter(Environment.getExternalStorageDirectory().getPath()+ "/foobar");
f.append("stuff");
f.close();


ルートファイルシステムは実際には読み取り専用であるため、例外は読み取り専用であると述べたと思います。

注:
java.io.FileNotFoundException: /foobar (Read-only file system)システムルートに書き込んでいることを
java.io.FileNotFoundException: /mnt/sdcard/foobar (Read-only file system)意味し、sdcardルートを意味します(この例外は発生しませんでした。これは単なる例です)

tl;dr間違ったパス

于 2012-10-25T22:31:32.093 に答える