Android中的mkdirs()在sdcard上无效。

3

我想在SD卡中创建一个目录,我按照以下步骤进行:

  1. 我在清单文件中添加了:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  2. 通过public static final String ROOT_PATH = Environment.getExternalStorageDirectory().toString() + "/Hello_World/";获取根路径,它返回/storage/emulated/0/Hello_World(在调试时获取)。

接下来,我运行了这段代码:

File file = new File(Constants.ROOT_PATH);
int i = 0;
while (!file.isDirectory() && !file.mkdirs()) {
    file.mkdirs();
    Log.e("mkdirs", "" + i++);
}

我也尝试了mkdirs()mkdir(),但在logcat中显示无限循环(Log.e("mkdirs", "" + i++);)。有时它可以工作,但有时却不行。 感谢您的帮助!
更新:我已经在一些设备上尝试了我的代码:Nexus4、nexus7、Vega Iron、Genymotion、LG G Pro,只有Vega Iron能按预期工作。??!!?!?


运行您的代码以将其安装在设备上。现在从计算机中拔出并运行您的应用程序。不要使用Log.e,而是显示一个toast。 - Hoan Nguyen
@HoanNguyen 我尝试了,但它没有帮助 :( - Justin
你需要更具体地描述所遇到的问题。请将“logcat中的无限循环”示例编辑到你的问题中。 - Chris Stratton
使用设备设置清除应用数据,然后再尝试我上面评论的操作。 - Hoan Nguyen
@ChrisStratton 这是由 Log.e("mkdirs", "" + i++); 命令引起的。@Hoan Nguyen:我之前尝试过清除数据、重新安装应用程序、更换设备(nexus4、nexus7、vega iron、genymotion),但仍然无法解决问题 :( - Justin
4个回答

2

试着这样做,它会在SD卡中创建一个文件夹

String root = Environment.getExternalStorageDirectory().toString();
File myDir = new File(root + "/hello_world");    
myDir.mkdirs();

如果您想检查文件是否存在,请使用以下代码。
File file = new File (myDir, file_name);
if (file.exists ()) 
   // file exist 
else 
   // file not exist  

请参考这个答案Android将文件保存到外部存储

。该答案提供了关于如何在Android设备上使用Java代码将文件保存到外部存储的详细说明。


我想知道你的解决方案和我的有什么不同?//还是不起作用 :( - Justin
它将在SD卡中创建一个文件夹..那么你期望什么? - RajaReddy PolamReddy
在我的代码中,我尝试在SD卡上创建一个名为Hello_World的文件夹,有时它能正常工作,有时则不行 :( - Justin
file.isDirectory()file.mkdirs()都返回false,所以我的while()循环陷入了无限循环。 - Justin
你真的检查了我的代码吗???你没有正确创建文件。因此它返回false。File file = new File(myDir,file_name);先创建文件夹,然后检查它是否是文件。仔细检查我的答案或参考链接中的代码。 - RajaReddy PolamReddy

1
感谢大家的帮助,最终我找到了问题所在。问题出在 while() 循环中,我将其替换为:

if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) && !file.isDirectory()) {
file.mkdirs();
}


你遇到的问题很可能是因为mkdirs()只有在创建目录时返回true,而不是当它已经存在时返回true。 - Chris Stratton

1
错误是由 while (!file.isDirectory() && !file.mkdirs()) 中的 && 导致的,应该改为 while (!file.isDirectory() || !file.mkdirs())。您还应该检查媒体是否已挂载。
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
    {
        if (DEBUG) {Log.d(TAG, "createSoundDir: media mounted");} //$NON-NLS-1$
        File externalStorage = Environment.getExternalStorageDirectory();
        if (externalStorage != null)
        {
            String externalStoragePath = externalStorage.getAbsolutePath();
            File soundPathDir = new File(externalStoragePath + File.separator + "Hello_World"); //$NON-NLS-1$

            if (soundPathDir.isDirectory() || soundPathDir.mkdirs())
            {
                String soundPath = soundPathDir.getAbsolutePath() + File.separator;
                if (DEBUG) {Log.d(TAG, "soundPath = " + soundPath);} //$NON-NLS-1$

            }
        }
    }

从我的一个项目中剪切和粘贴。


0

使用以下代码Environment.getExternalStorageDirectory().getAbsolutePath()...

public static final String ROOT_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Hello_World/";

在创建目录之前,请检查SD卡是否已挂载,如下所示...

File file = new File(Constants.ROOT_PATH);
int i = 0;

if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
      if(!file.exists()) {
          file.mkdir();
      }
}

谢谢您的回答,但它仍然返回/storage/emulated/0/Hello_World并且仍然无法工作。顺便问一下,我想知道为什么您编辑了我的帖子(我很难阅读)并给我-1?再次感谢! - Justin
我看到并进行了更改,但是没有任何变化 :( - Justin

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