2011-10-11 3 views
3

내 응용 프로그램은 SD 카드에 파일을 저장하는 기능이 있습니다. 파일 이름에 특수 문자가있는 SD 카드의 파일 저장 문제

다음

파일을 저장하려면 코드입니다

이 그것에서 (예. "안녕하세요 World.txt") (예. 안녕하세요? 세상을 공간을 포함하는 파일 이름으로 충돌하기 전에 완전히 잘 작동
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(); 
} 

.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이됩니다.


는 마우스의 코멘트를 본 후, 나는 그것이 파일 이름에 공간이되지 않을 수 있다는 것을 깨달았다. 여기에 스택 추적이 있습니다.

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")입니다. 어떤 생각?


비슷한 문제에 직면 한 사용자를 위해 파일 이름에 실제로 유효하지 않은 문자가 있습니다. 나는 this thread을 발견했는데, 이는 파일 이름에 유효하지 않은 문자에 관한 더 많은 정보를 가지고있다. 희망이 어떤 의심을 취소합니다.

+0

f.createNewFile()없이 사용 해보십시오. –

+0

FileNotFoundException – PH7

+0

에 매니페스트 파일에 저장 권한을 설정해야합니다. –

답변

0

"Hello World.txt"에는 무엇이 잘못되었지만 "Who are the World? Smokers or Non-smokers .acsm"에는 잘못된 문자 "?"가 포함되어 있습니다. 충돌을 피하기 위해 유효하지 않은 문자가 있는지 확인해야합니다.

+0

나는 이것이 옳다고 생각한다. "?" Linux에서 사용되는 경우 Android에서 허용되지 않습니다. 어쨌든 파일/폴더의 특수 문자가 다중 플랫폼과 호환되지 않도록하는 것이 좋습니다. – karnok

+0

@stefan, 나는 당신의 요지를 얻는다. 불행히도, 나는 그들이 액세스 할 수없는 데이터 소스에서 가져온 파일 이름을 사용하는 것을 피할 수 없으며 그 이름으로 저장되는 파일도 필요합니다. 잘못된 문자에 대해 더 많은 정보를 제공하거나 링크를 제공 할 수 있습니까? – PH7

+0

죄송합니다. 안드로이드에 대한 잘못된 문자 목록이 없습니다. 이 문제는 FAT32 문제 일 수 있으므로 다음 문자가 모두 잘못되었다는 것을 의미합니다./\ : *? "<> | – stefan

관련 문제