【问题标题】:getExternalFilesDir NOT creating new DirectorygetExternalFilesDir 不创建新目录
【发布时间】:2014-05-27 18:20:18
【问题描述】:

我正在尝试检查 SD 卡上的子目录结构是否存在;
如果不是,则创建一个新的。
那当然是在我的代码验证 SD 卡已安装并准备就绪之后。

我创建了有效的代码,并且我成功地在手机的 SD 卡上创建了结构,所以我知道我的代码是好的。然后我就去睡觉了。第二天,我将工作代码从我的 TEST 区域移到了我的 WORKING 区域,现在它不起作用了!! :-( 我什至把它移回了测试区,仍然没有工作!!

我猜 Android Gremlins 在晚上做了一些事情来破解密码!

所以...要么是 Android Gremlins 做了什么,要么是我在移动代码时忘记了一些东西(这是一个很长的镜头)。有人有Gremlin驱虫剂吗??

我很确定,在我的手机上运行并实际创建了我现在可以看到的结构的代码是这样的:


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 访问之后)我试图将这个和其他代码从我的测试区域移动到不同的部分,之后,它不再会创建一个结构。

我使用了除虫器(即 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 评论说我可能需要在 Manifest 文件中添加正确的权限。

由于代码 DID WORK,这意味着我 DID 已经启用了此权限。
但是,我决定删除这个权限,看看它会抛出什么错误,我认为没有权限它不会编译。然后我运行代码并没有抛出任何错误!是的,它仍然不会创建新文件..

【问题讨论】:

  • 在 StackOverflow 上写问题时,您的目标应该是让那些有能力提供帮助的人尽可能轻松地实际提供帮助。多余的喊叫、对虚构生物的引用以及多余的标点符号共同使这个问题比它需要的更难理解。

标签: android file directory directory-structure


【解决方案1】:

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

【讨论】:

  • 确认可以在 Android 10 上运行,他们应该更新内联文档以使其清晰。这应该是公认的答案。
【解决方案2】:

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

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);

【讨论】:

  • 注意:由于 Environment.getExternalStorageDirectory 已被弃用,此代码将在 API 级别 29 中像魅力一样工作,这是最好的替代解决方案。
  • 我试过这个代码,它在三星 a70 android 10 中对我不起作用。使用这个代码时没有创建目录。 getExternalStorageDirectory() 正在工作,但已被弃用..任何解决方案?
【解决方案3】:

也许您需要将此权限添加到您的 AndroidManifest.xml 文件中:

android.permission.WRITE_EXTERNAL_STORAGE

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

【讨论】:

  • 感谢您的猜测......但正如我所说......它已经工作......并在 SD 卡上创建了文件......所以是的......我已经包含了 android.permission .RITE_EXTERNAL_STORAGE。我认为我不需要将其包含在原始问题陈述中,因为我表示它确实有效......但它在 Manefest 中
  • 嗯,您提供的信息越多,我们就越容易了解您在 Android 开发中遇到的问题,以便我们为您提供帮助。我会尝试的一件事是调试您的变量 m_Context 以查看它是否返回 null。这是我要检查的第一件事。
  • 您不需要为getExternalFilesDir()添加此权限。
【解决方案4】:

您必须致电dir.mkdirs() 来创建目录!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 2018-07-30
    • 2016-11-15
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多