【问题标题】:Created folder is not visible in the file explorer..创建的文件夹在文件资源管理器中不可见..
【发布时间】:2012-11-15 09:46:02
【问题描述】:

我在 sdcard 上创建文件夹和文件时遇到问题。

代码如下:

    File folder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString() + "/folder");
    boolean success;
    if (!folder.exists()) {
        success = folder.mkdirs();
    }
    File obdt = new File(folder, "file.txt");
    try {
        success = obdt.createNewFile();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

使用此代码,我希望在 SD 卡的 Download 文件夹中创建文件夹folder,并在此文件中创建 file。我希望用户可以访问该文件。所以我想把它放在一个共享文件夹中。
success 变量是 true,当我再次运行代码时,该文件夹已经存在并且不在 if 块中。
但是我在文件资源管理器中看不到 SD 卡上创建的文件夹和文件。

信息:getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString() 返回storage/sdcard/Download

我使用 Galaxy Nexus。

【问题讨论】:

  • 你有任何例外说PERMISSION的东西吗?如果你用false 的值初始化success 会怎样?
  • 不,我没有例外...未初始化时成功为假
  • 你能找到这些文件夹“storage/sdcard/Download”吗?
  • 没有存储文件夹是空的...我在linux下工作...也许有问题?!

标签: android file sd-card createfile create-directory


【解决方案1】:

该死! :)

现在我解决了我的问题...我误解了在文件系统中创建文件的操作。
当我谈到文件资源管理器时,我指的是操作系统的文件资源管理器,而不是 DDMS 中的文件资源管理器 :)。
我想当我创建一个文件时,我会在操作系统的文件资源管理器中看到它,但是当设备连接到 PC 时,文件只能在 DDMS 文件资源管理器中看到。
抱歉,我是 Android 新手 ;)

当应用程序在没有 PC 连接的情况下独立运行时,然后我连接到 PC,我当然会看到创建的文件和文件夹 :)

感谢您的帮助

【讨论】:

    【解决方案2】:

    logcat 有什么错误吗?
    其他:尝试类似 Log.I("PATHNAME",folder.absolutePath());然后查看您的 logcat 以确保您在哪里创建您认为的文件夹。

    【讨论】:

    • 路径为:/storage/sdcard0/Download/folder
    【解决方案3】:

    如果您还没有这样做,则需要通过将以下行添加到您的清单中,为您的应用授予写入 SD 卡的正确权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    

    如果你已经这样做了,看看是否:

    File obdt = new File(/sdcard/folder/file.txt)
    try {
        success = obdt.createNewFile();
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    

    有效。

    【讨论】:

    • 文件的创建 obdt = new File("/sdcard/file.txt");是成功的,但我在文件资源管理器中看不到它-.-
    • 这很奇怪。你会从终端尝试adb shell ls /sdcard/file.txt 吗?
    【解决方案4】:

    您在资源管理器中看不到文件夹/文件?也许是因为 MediaScanner 处于活动状态,但没有添加您的文件。您可以在程序中执行此操作,也可以在手机设置中切换某处的媒体扫描仪。

    MediaScanner

    Trigger MediaScanner

    【讨论】:

      【解决方案5】:

      试试这个。

              File dir = new File(Environment.getExternalStorageDirectory()
                      + "/XXX/Wallpapers/");
              File[] files = dir.listFiles();
      
              if (files == null)
      
              {
                  int numberOfImages = 0;
                  BitmapDrawable drawable = (BitmapDrawable) imageView
                          .getDrawable();
                  Bitmap bitmap = drawable.getBitmap();
                  File sdCardDirectory = Environment
                          .getExternalStorageDirectory();
                  new File(sdCardDirectory + "/XXX/Wallpapers/").mkdirs();
                  File image = new File(sdCardDirectory
                          + "/XXX/Wallpapers/Sample" + numberOfImages + ".JPG");
      
                  boolean success = false;
                  FileOutputStream outStream;
                  try {
                      outStream = new FileOutputStream(image);
                      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
                      outStream.flush();
                      outStream.close();
                      success = true;
                  } catch (FileNotFoundException e) {
                      e.printStackTrace();
                  } catch (IOException e) {
                      e.printStackTrace();
      
                  }
                  if (success) {
                      Toast.makeText(
                              getApplicationContext(),
                              "Image saved successfully in Sdcard/XXX/Wallpapers",
                              Toast.LENGTH_LONG).show();
                  } else {
                      Toast.makeText(getApplicationContext(),
                              "Error during image saving", Toast.LENGTH_LONG)
                              .show();
                  }
      

      不要忘记在清单中添加权限

        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
      

      【讨论】:

      • 图像已成功保存在 Sdcard/XXX/Wallpapers 中,如果我再次运行文件是 != null 并且不在 if 块中...似乎一切都正确,但在文件资源管理器中我没有'看不到文件夹和图片! -.-
      • 你还能在文件资源管理器中看到什么,并尝试在你的移动/设备上运行它,你肯定会得到它
      【解决方案6】:

      显然,MTP 中存在一个已知错误。

      Issue 195362 所有使用 MTP 而非 USB 大容量存储的手机在使用 USB 电缆连接到计算机时都无法正确显示文件列表。设备上运行的 Android 应用也无法看到这些文件。

      实际上和 2012 年一样古老

      【讨论】:

        【解决方案7】:

        我遇到了同样的问题:创建的文件和文件夹在写入 sdcard 后不会立即显示,尽管文件已被刷新和关闭!!

        它们不会通过 USB 或手机上的文件浏览器显示在您的计算机上。

        我观察到三件事:

        1. 如果文件的绝对路径以 /storage/emulated/0/ 开头,这并不意味着它会在您的 SD 卡上 - 它可能会在您的主存储上。
        2. 如果您等待大约 5 分钟,文件会开始通过 USB 显示(即 Windows 资源管理器和内置文件资源管理器)
        3. 如果您从终端使用adb shell ls /sdcard,则文件会显示!您可以使用adb pull ... 立即获取文件。您也可以使用 DDMS。

        我使用的代码是:

                Gson gson = new GsonBuilder().setPrettyPrinting().create();
                String json = gson.toJson(myArrayList);
        
                try {
                    File externalDir = getExternalStorageDirectory();
                    File newFile = new File(externalDir, "myfile.txt");
                    FileOutputStream os = new FileOutputStream(newFile);
                    os.write(json.getBytes());
                    os.flush();
                    os.close();
                    Timber.i("saved file to %s",newFile.getAbsoluteFile().toString());
                }catch (Exception ex)
                {
                    Toast.makeText(getApplicationContext(), "Save to private external storage failed. Error message is " + ex.getMessage(), Toast.LENGTH_LONG).show();
                }
        

                Gson gson = new GsonBuilder().setPrettyPrinting().create();
                String json = gson.toJson(myArrayList);
        
                try {
                    File externalDir = getExternalStorageDirectory();
                    File newFile = new File(externalDir, "myfile.txt");
                    FileWriter fw = new FileWriter(newFile);
                    fw.write(json);
                    fw.flush();
                    fw.close();
                    Timber.i("saved file to %s",newFile.getAbsoluteFile().toString());
                }catch (Exception ex)
                {
                    Toast.makeText(getApplicationContext(), "Save to private external storage failed. Error message is " + ex.getMessage(), Toast.LENGTH_LONG).show();
                }
        

        为什么会这样?似乎是您第一次体验时必须忍受的另一种“Android 主义”。

        【讨论】:

          猜你喜欢
          • 2013-06-19
          • 2016-03-19
          • 2012-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-22
          • 1970-01-01
          • 2020-03-17
          相关资源
          最近更新 更多