【发布时间】:2017-07-10 20:29:55
【问题描述】:
我有一些代码应该创建一些公共文件夹并在其中保存文件。 我的代码适用于我的 Android 7 设备,但不适用于 4.1.1 或 5.1.1(我没有在其他手机上尝试过。)
我的代码如下
public void createFile() {
calendar_time = Calendar.getInstance(Locale.getDefault());
int hour = calendar_time.get(Calendar.HOUR_OF_DAY);
int minute = calendar_time.get(Calendar.MINUTE);
int second = calendar_time.get(Calendar.SECOND);
String time=String.valueOf(hour)+":"+String.valueOf(minute)+":"+String.valueOf(second);
String sFileName=date+" "+time+" Part "+String.valueOf(file_counter)+".txt";
try {
File root = new File(Environment.getExternalStorageDirectory()+ "/Main Folder/"+date);
if (!root.exists()) {
root.mkdir();
}
myfile = new File(root.getAbsolutePath(), sFileName);
if (!myfile.exists()) {
myfile.createNewFile();
}
writer = new FileWriter(myfile);
writer.append("Unit\n\n");
writer.append("#\tValue \tX \tY \tZ \tTime\n\n");
Toast.makeText(context, "Recording...", Toast.LENGTH_LONG).show();
readyToRecord=true;
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(context, "Error creating file", Toast.LENGTH_SHORT).show();
stop();
}
}
在 android 7 上可以完美运行。在较低版本上虽然没有。
如果我包含 myfile.createNewFile(); 行,我会收到以下错误
07-10 23:24:12.307 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: java.io.IOException: open failed: ENOENT (No such file or directory)
07-10 23:24:12.307 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at java.io.File.createNewFile(File.java:941)
07-10 23:24:12.307 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at textfiletest.xyz.mreprogramming.textfiletest.Recorder.createFile(Recorder.java:91)
07-10 23:24:12.307 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at textfiletest.xyz.mreprogramming.textfiletest.Recorder.startRecording(Recorder.java:67)
07-10 23:24:12.307 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at textfiletest.xyz.mreprogramming.textfiletest.MainActivity.getPermission(MainActivity.java:97)
07-10 23:24:12.308 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at textfiletest.xyz.mreprogramming.textfiletest.MainActivity.access$100(MainActivity.java:33)
07-10 23:24:12.308 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at textfiletest.xyz.mreprogramming.textfiletest.MainActivity$1.onClick(MainActivity.java:63)
07-10 23:24:12.308 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at android.view.View.performClick(View.java:4856)
07-10 23:24:12.308 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at android.view.View$PerformClick.run(View.java:19956)
07-10 23:24:12.308 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at android.os.Handler.handleCallback(Handler.java:739)
07-10 23:24:12.308 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
07-10 23:24:12.308 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at android.os.Looper.loop(Looper.java:211)
07-10 23:24:12.308 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5389)
07-10 23:24:12.308 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at java.lang.reflect.Method.invoke(Native Method)
07-10 23:24:12.308 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at java.lang.reflect.Method.invoke(Method.java:372)
07-10 23:24:12.308 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
07-10 23:24:12.308 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
07-10 23:24:12.308 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
07-10 23:24:12.308 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at libcore.io.Posix.open(Native Method)
07-10 23:24:12.308 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
07-10 23:24:12.308 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at java.io.File.createNewFile(File.java:934)
07-10 23:24:12.308 6888-6888/textfiletest.xyz.mreprogramming.textfiletest W/System.err: ... 15 more
如果我不包含 myfile.createNewFile(); 行,我会收到以下不同的错误
07-10 23:26:29.755 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Ultimate EMF Detector/10-Ιουλ-2017/10-Ιουλ-2017 23:26:29 Part 1.txt: open failed: ENOENT (No such file or directory)
07-10 23:26:29.755 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at libcore.io.IoBridge.open(IoBridge.java:465)
07-10 23:26:29.755 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
07-10 23:26:29.755 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:72)
07-10 23:26:29.755 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at java.io.FileWriter.<init>(FileWriter.java:42)
07-10 23:26:29.755 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at textfiletest.xyz.mreprogramming.textfiletest.Recorder.createFile(Recorder.java:92)
07-10 23:26:29.755 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at textfiletest.xyz.mreprogramming.textfiletest.Recorder.startRecording(Recorder.java:67)
07-10 23:26:29.755 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at textfiletest.xyz.mreprogramming.textfiletest.MainActivity.getPermission(MainActivity.java:97)
07-10 23:26:29.755 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at textfiletest.xyz.mreprogramming.textfiletest.MainActivity.access$100(MainActivity.java:33)
07-10 23:26:29.755 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at textfiletest.xyz.mreprogramming.textfiletest.MainActivity$1.onClick(MainActivity.java:63)
07-10 23:26:29.755 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at android.view.View.performClick(View.java:4856)
07-10 23:26:29.755 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at android.view.View$PerformClick.run(View.java:19956)
07-10 23:26:29.755 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at android.os.Handler.handleCallback(Handler.java:739)
07-10 23:26:29.755 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
07-10 23:26:29.755 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at android.os.Looper.loop(Looper.java:211)
07-10 23:26:29.755 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5389)
07-10 23:26:29.755 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at java.lang.reflect.Method.invoke(Native Method)
07-10 23:26:29.755 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at java.lang.reflect.Method.invoke(Method.java:372)
07-10 23:26:29.755 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
07-10 23:26:29.755 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
07-10 23:26:29.755 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
07-10 23:26:29.756 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at libcore.io.Posix.open(Native Method)
07-10 23:26:29.756 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
07-10 23:26:29.756 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: at libcore.io.IoBridge.open(IoBridge.java:451)
07-10 23:26:29.756 9831-9831/textfiletest.xyz.mreprogramming.textfiletest W/System.err: ... 18 more
你能帮帮我吗? 权限处理得当:Manifest and runtime if required based on android version.
编辑 我把代码改成了这个
File dir = new File(Environment.getExternalStorageDirectory() + "/Main Folder/"+date);
dir.mkdirs();
myfile = new File(dir, sFileName);
myfile.createNewFile();
这解决了 Android 5.1.1 的问题,但 android 4.1.1 仍然弹出相同的错误。
【问题讨论】:
-
类似问题的解决方案stackoverflow.com/a/11620848/6574408
-
@GiacomoLai 使用您链接中的信息我修复了 5.1.1 但 4.1.1 仍然无法正常工作
-
尝试打印
dir,看看它是否代表一个有效的目录名。我很确定问题出在那儿。 -
@VirendraSingh 打印目录和 myfile 帮助我注意到名称可能是问题所在。谢谢
-
在 Stackoverflow 上,通过支持评论/回答来表示感谢。
标签: android environment filenotfoundexception android-external-storage