【问题标题】:Trouble saving file in SD card with special characters in filename无法将文件保存在 SD 卡中的文件名中包含特殊字符
【发布时间】:2011-10-11 09:41:06
【问题描述】:

我的应用程序具有将文件保存在 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 上找到了this thread,其中包含有关文件名中无效字符的更多信息。希望这能消除任何疑虑。

【问题讨论】:

  • 尝试不使用 f.createNewFile();
  • 它会给出 FileNotFoundException
  • 你是否在清单文件中设置了存储权限。
  • 是的。仅当文件名有空格时才会出现此问题。单字文件名就可以了。
  • 对我来说效果很好,有空格或没有空格。尝试调试 - 进入 File.java,看看它在哪里抛出异常。

标签: android android-sdcard java-io invalid-argument


【解决方案1】:

我不知道“Hello World.txt”有什么问题,但“谁拥有世界?吸烟者或非吸烟者 .acsm”包含无效字符“?”。也许您应该检查无效字符以避免崩溃。

【讨论】:

  • 我认为这是对的。虽然 ”?”在Linux中使用,我认为在Android中是不允许的。无论如何,最好避免文件/文件夹中的特殊字符以适应多平台。
  • @stefan,我明白你的意思。不幸的是,我无法避免使用这些文件名,因为它们是从我无权访问的数据源中获取的,并且我也需要以该名称保存文件。你能给我更多关于无效字符的信息或链接吗?
  • 很抱歉,我没有适用于 android 的无效字符列表。我认为这可能是 FAT32 问题,因此这意味着以下所有字符均无效:/\:*?"|
  • 也许你可以用在每个浏览器中类似的方式替换无效字符(你知道:%20 代表“”)。您真的需要存储具有该名称的文件还是需要用无效字符显示
  • @stefan,我在一个 SO 链接中发现了不允许的字符。我编辑了我的问题并放入了链接本身。对于我的问题,我暂时只是做了一个工作,因为我的要求是文件具有唯一且一致的名称。最后但同样重要的是,我感谢您的帮助。干杯! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
相关资源
最近更新 更多