Не удается сохранить файл на SD-карте со специальными символами в имени файла - PullRequest
3 голосов
/ 11 октября 2011

В моем приложении есть функция сохранения файла на SD-карте.

Ниже приведен мой код для сохранения файла

try {               
    File mediaDir = new File(
    Environment.getExternalStorageDirectory(), "Media");
    if (!mediaDir.exists()) {
        mediaDir.mkdirs();
    }
    File f = new File(mediaDir, fileName);
    f.createNewFile(); 
    OutputStream os = new FileOutputStream(f);
    byte[] data = toWriteBytes;
    os.write(data);
    os.close(); 
} catch (Exception e) {
    Log.w("ExternalStorage", "Error writing ");
    e.printStackTrace();
}

Это прекрасно работает, пока не наткнулся на имя файла с пробелом (например, "Hello World.txt") (например, hello? World.txt)

Вот трассировка стека на случай, если вам всем понадобится

10-11 17:18:48.225: WARN/ExternalStorage(4519): Error writing
10-11 17:18:48.225: WARN/System.err(4519): java.io.IOException: Invalid argument
10-11 17:18:48.235: WARN/System.err(4519):     at java.io.File.createNewFileImpl(Native Method)10-11 17:18:48.245: WARN/System.err(4519):     at java.io.File.createNewFile(File.java:1257)
10-11 17:18:48.245: WARN/System.err(4519):     at com.xxxx.Utility.createExternalStoragePrivateFile(Utility.java:87)
10-11 17:18:48.245: WARN/System.err(4519):     at com.xxxxxx$1.handleMessage(Utility.java:52)
10-11 17:18:48.245: WARN/System.err(4519):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-11 17:18:48.245: WARN/System.err(4519):     at android.os.Looper.loop(Looper.java:123)
10-11 17:18:48.245: WARN/System.err(4519):     at android.app.ActivityThread.main(ActivityThread.java:3839)
10-11 17:18:48.245: WARN/System.err(4519):     at java.lang.reflect.Method.invokeNative(Native Method)
10-11 17:18:48.245: WARN/System.err(4519):     at java.lang.reflect.Method.invoke(Method.java:507)
10-11 17:18:48.245: WARN/System.err(4519):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
10-11 17:18:48.245: WARN/System.err(4519):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
10-11 17:18:48.245: WARN/System.err(4519):     at dalvik.system.NativeStart.main(Native Method)

Итак, мой вопрос: в чем конкретно может быть проблема и как мне ее решить?

** Примечание: я проверил это, используя имя файла с одним словом, и это прекрасно. Без f.createNewFile() это даст FileNotFoundException.


Увидев комментарий Mice, я понял, что это может быть не пробел в имени файла. Итак, вот трассировка стека.

10-11 18:06:20.365: WARN/System.err(5280): java.io.FileNotFoundException: /mnt/sdcard/Media/Who owns the World? Smokers or Non-smokers .acsm (Invalid argument)
10-11 18:06:20.385: WARN/System.err(5280):     at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method)
10-11 18:06:20.385: WARN/System.err(5280):     at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232)
10-11 18:06:20.385: WARN/System.err(5280):     at java.io.FileOutputStream.<init>(FileOutputStream.java:94)
10-11 18:06:20.385: WARN/System.err(5280):     at java.io.FileOutputStream.<init>(FileOutputStream.java:66)
10-11 18:06:20.385: WARN/System.err(5280):     at com.xxxx.Utility.createExternalStoragePrivateFile(Utility.java:88)
10-11 18:06:20.385: WARN/System.err(5280):     at com.xxxxx.Utility$1.handleMessage(Utility.java:52)
10-11 18:06:20.385: WARN/System.err(5280):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-11 18:06:20.385: WARN/System.err(5280):     at android.os.Looper.loop(Looper.java:123)
10-11 18:06:20.385: WARN/System.err(5280):     at android.app.ActivityThread.main(ActivityThread.java:3839)
10-11 18:06:20.385: WARN/System.err(5280):     at java.lang.reflect.Method.invokeNative(Native Method)
10-11 18:06:20.385: WARN/System.err(5280):     at java.lang.reflect.Method.invoke(Method.java:507)
10-11 18:06:20.385: WARN/System.err(5280):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
10-11 18:06:20.385: WARN/System.err(5280):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
10-11 18:06:20.385: WARN/System.err(5280):     at dalvik.system.NativeStart.main(Native Method)

Я подумал, что в имени файла должен быть какой-то недопустимый символ. Имя файла («Кто владеет миром? Курильщики или некурящие .acsm»). Есть мысли?


В интересах тех, кто сталкивается с подобной проблемой, это действительно недопустимый символ в имени файла. Я обнаружил эту ветку на SO, которая содержит больше информации о недопустимых символах в имени файла. Надеюсь, это рассеет любые сомнения.

1 Ответ

0 голосов
/ 11 октября 2011

Понятия не имею, что не так с «Hello World.txt», но «Кто владеет миром? Курильщики или некурящие .acsm» содержит неверный символ «?» Возможно, вам следует реализовать проверку на недопустимые символы, чтобы избежать сбоев.

...