【问题标题】:Result of 'File.mkdirs()' is ignored'File.mkdirs()' 的结果被忽略
【发布时间】:2022-01-03 19:37:50
【问题描述】:

这是我在myDir.mkdirs(); 中的代码,此代码显示File.mkdirs() 的结果警告被忽略。

我尝试修复此警告,但失败了。

   private void saveGIF() {
            Toast.makeText(getApplicationContext(), "Gif Save", Toast.LENGTH_LONG).show();
            String filepath123 = BuildConfig.VERSION_NAME;
            try {
                File myDir = new File(String.valueOf(Environment.getExternalStorageDirectory().toString()) + "/" + "NewyearGIF");enter code here

    //My Statement Code This Line Show Me that Warning

 myDir.mkdirs();

                File file = new File(myDir, "NewyearGif_" + System.currentTimeMillis() + ".gif");
                filepath123 = file.getPath();
                InputStream is = getResources().openRawResource(this.ivDrawable);
                BufferedInputStream bis = new BufferedInputStream(is);
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                byte[] img = new byte[AccessibilityNodeInfoCompat.ACTION_NEXT_HTML_ELEMENT];
                while (true) {
                    int current = bis.read();
                    if (current == -1) {
                        break;
                    }
                    baos.write(current);
                }
                FileOutputStream fos = new FileOutputStream(file);
                fos.write(baos.toByteArray());
                fos.flush();
                fos.close();
                is.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            Intent mediaScanIntent = new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE");
            mediaScanIntent.setData(Uri.fromFile(new File(filepath123)));
            sendBroadcast(mediaScanIntent);
        }

【问题讨论】:

  • Result of 'File.mkdirs()' is ignored。是的。由你!您没有查看返回值。
  • Docs 说,>你可能会提到文件的更深的路径,但是,不需要创建所有的父目录。因为,有些人可能已经创建了。有些不是。因此,即使它未能创建已经存在的目录,它也会创建不存在的目录,这将产生成功的结果。创建所有必要的目录后,它将给出真实的结果。因此,在这种情况下需要检查布尔条件。

标签: java android


【解决方案1】:

mkdirs 方法有一个 boolean 返回值,你没有使用它。

 boolean wasSuccessful = myDir.mkdirs();

创建操作返回一个值,指示目录创建是否成功。例如,结果值wasSuccessful 可用于在为 false 时显示错误。

if (!wasSuccessful) { 
    System.out.println("was not successful."); 
}

来自Java docs关于boolean的返回值:

当且仅当目录被创建时为真,连同所有 必要的父目录;否则为假

【讨论】:

  • 如果目录已经存在,则返回false。正如您的代码所示,这不一定是错误。
【解决方案2】:
File CDir = new File(Environment.getExternalStorageDirectory(), IMPORT_DIRECTORY);
if (!CDir.exists()) {
    boolean mkdir = CDir.mkdir();
    if (!mkdir) {
        Log.e(TAG, "Directory creation failed.");
    }
}

mkdir 返回一个布尔值。我们需要从 mkdir 捕获返回值。用这个替换你的代码并检查(File.mkdirs() 的结果警告被忽略。)将消失

【讨论】:

    【解决方案3】:

    mkdir 的返回值背后的想法是,每个 IO 操作都可能失败,您的程序应该对这种情况做出反应。

    【讨论】:

    • 怎么样?例如,我使用 File.delete()。我通常不在乎它是否不起作用,因为我对此无能为力。也许有人/其他人在我做之前删除了它。那又怎样……
    • @TheincredibleJan 我同意你的观点,我通常不在乎。我认为这是您可以做出反应的一个选项(在极少数情况下)。
    【解决方案4】:
    File myDirectory = new File(Environment.getExternalStorageDirectory(),"NewyearGIF");
    if(!myDirectory.exists()) {
       myDirectory.mkdirs(); 
    }else{
       // Directory already exist
    }
    

    【讨论】:

      【解决方案5】:

      你可以这样做:

      if(myDirectory.exists() || myDirectory.mkdirs()) {
         // Directory was created, can do anything you want
      }
      

      或者您可以使用以下方法删除警告:

      @SuppressWarnings("ResultOfMethodCallIgnored")
      

      mkdirs 方法检查文件是否存在,但如果目录已创建则返回 false,因此您应该使用第一种方法再检查一次。

      【讨论】:

        【解决方案6】:

        这是一个老问题,但我发现的最简单的方法是:

        File imageThumbsDirectory = getBaseContext.getExternalFilesDir("ThumbTemp");
        
        if(imageThumbsDirectory != null) {
            if (!imageThumbsDirectory.exists()) {
                if (imageThumbsDirectory.mkdir()) ; //directory is created;
            }
        }
        

        【讨论】:

          【解决方案7】:

          只需输入以下代码:

          File myDirectory = new File(Environment.getExternalStorageDirectory(),"NewyearGIF");
          if(!myDirectory.exists()) {
             myDirectory.mkdirs(); 
          }else{
             // Directory already exist
          }
          

          如果应用运行在Lollipop以上,则需要添加运行时存储权限。

          【讨论】:

          • myDirectory.mkdirs(); 。您也忽略了结果值。返回值。应该是if ( !myDirectory.mkdirs()){ Toast(sorry could not make directory); return false;}
          • @JayminBhadani 您正在测试 Lollipop 或 marshmallow 的哪个操作系统?
          • @JayminBhadani 您是否允许设置>应用程序>应用程序名称>权限的存储权限?
          猜你喜欢
          • 2016-07-01
          • 2021-05-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-30
          • 2020-05-01
          • 1970-01-01
          相关资源
          最近更新 更多