getExternalFilesDir不创建新目录

5

我想要检查SD卡上的子目录结构是否存在;
如果不存在,则创建一个新的。
当然,在我的代码验证SD卡已经挂载且准备好之后。

我编写了代码,它可以工作,并且成功地在我的手机SD卡上创建了结构,因此我知道我的代码是好的。然后我去睡觉了。第二天,我把工作代码从测试区域移动到工作区域,现在它不起作用了!! :-( 我甚至将其移回测试区域,仍然无法工作!!

我猜夜间安卓小精灵做了些破坏代码的事情!

所以……要么是安卓小精灵做了些事情,要么(这很不可能)在我移动代码时我可能忘记了某些东西。有人有小精灵驱逐剂吗?

我非常确定可以工作并实际上创建了我现在可以在手机上看到的结构的代码类似于:


String strPathName = m_Context.getExternalFilesDir (null) .toString ();
// This DOES give the Correct Path on the SD Card

File dir;  

dir = new File (m_Context.getExternalFilesDir (null) + "/MyDirectory");  
dir = new File (m_Context.getExternalFilesDir (null) + "/MyDirectory/SubDir");  
dir = new File (m_Context.getExternalFilesDir (null) + "/MyDirectory/SubDir/xxx");  

我可以清楚地看到这个结构在我的手机上。它现在还在!!

第二天(即 Android Gremlins 来访之后),我试图将这个和其他代码从测试区域移动到另一个部分,但之后,它就不能再创建一个结构了。

我使用 De-Bugger(即 Gremlin Killer)进行步进调试,以下是发生的情况。

File dir;  
boolean bDirExists;  

dir = new File (m_Context.getExternalFilesDir (null) + "/NewDirectory");  
bDirExists = (dir.exists () && dir.isDirectory () );  // FALSE  

dir = new File (m_Context.getExternalFilesDir (null) + "/NewDirectory/SubDir");  
bDirExists = (dir.exists () && dir.isDirectory () );   // FALSE  
bDirExists = dir.exists ();                                                     // FALSE  
bDirExists = dir.isDirectory ();                                            // FALSE  

dir = new File (m_Context.getExternalFilesDir (null) + "/NewDirectory/SubDir/xxx");  
bDirExists = (dir.exists () && dir.isDirectory () );   // FALSE  

如果……我使用了前一天使用的原始名称 "/MyDirectory/SubDir/xxx"
那么,代码表明该目录存在。

dir = new File (m_Context.getExternalFilesDir (null) + "/MyDirectory");  
bDirExists = (dir.exists () && dir.isDirectory () );   // TRUE  

dir = new File (m_Context.getExternalFilesDir (null) + "/MyDirectory/SubDir");  
bDirExists = (dir.exists () && dir.isDirectory () );   // TRUE  
bDirExists = dir.exists ();   // TRUE  
bDirExists = dir.isDirectory ();   // TRUE  

现在...正如我们都知道的那样,程序员永远不会破坏自己的代码,也不会在“已知可用的代码”中引入错误,所以...一定是小精灵造成的...对吗?


第一个更新

@ChuongPham评论说我可能需要在清单文件中添加正确的权限。

由于代码确实可以工作,这意味着我已经启用了此权限。
然而,我决定删除此权限并查看它会产生什么错误,我认为没有权限就无法编译。 然后我运行了代码,没有出现任何错误!! 是的,它仍然无法创建新文件...


4
在 StackOverflow 提问时,你的目标应该是尽可能地让那些有能力帮助你的人更容易地提供帮助。过多的大声喊叫、对虚构生物的引用和冗余的标点符号结合在一起,使这个问题比必要的情况下更难以理解。 - CommonsWare
4个回答

9
如果您使用m_Context.getExternalFilesDir("MyDirectory/SubDir"),则会自动为您创建自定义目录。 在API 19或更高版本上进行了测试...

1
已确认在Android 10上可用,他们应该更新内联文档以使其清晰明了。那应该是被接受的答案。 - Slion

3
创建自定义目录相当简单,请检查以下代码:

创建自定义目录相当简单。请检查以下代码:

File folder = new File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "Your directory name");
        if (!folder.exists()) {
            folder.mkdirs();
        }
        File filename = new File(folder, "Your file name");
        OutputStream out = new FileOutputStream(filename);

2
注意:此代码将在API级别29中像魔术般运行,因为Environment.getExternalStorageDirectory已被弃用,这是最佳替代解决方案。 - Meet
我尝试了这段代码,但在我的三星A70 Android 10上无法运行。使用此代码时未创建目录。getExternalStorageDirectory()虽然可用,但已被弃用。有什么解决办法吗? - athul

0
也许你需要将这个权限添加到你的 AndroidManifest.xml 文件中:
android.permission.WRITE_EXTERNAL_STORAGE

此外,请阅读这里,了解有关API 19及更高版本的注意事项。

感谢你的猜测...但正如我所说...它已经工作了...并在SD卡上创建了文件...所以是的...我已经包含了android.permission.RITE_EXTERNAL_STORAGE。我认为我不需要在原始问题陈述中包含它,因为我指出它确实起作用了...但它确实在清单中。 - user3239782
2
提供的信息越多,我们就越容易知道您在Android开发中遇到了什么问题,以便我们能够帮助您。我建议您尝试调试变量m_Context,看它是否返回null。这是我首先要检查的事情。 - ChuongPham
你不需要为 getExternalFilesDir() 添加此权限。 - Bokili Production

0

你必须调用 dir.mkdirs() 来创建目录!!!


但是我调用了dir.mkdirs(),它仍然不存在。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接