190

我正在尝试将我的文件保存到以下位置
FileOutputStream fos = new FileOutputStream("/sdcard/Wallpaper/"+fileName); ,但出现异常java.io.FileNotFoundException
但是,当我将路径设置为"/sdcard/"有效时。

现在我假设我无法以这种方式自动创建目录。

有人可以建议如何创建directory and sub-directory使用代码吗?

4

14 回答 14

453

如果您创建一个包装顶级目录的File对象,您可以调用它的mkdirs()方法来构建所有需要的目录。就像是:

// create a File object for the parent directory
File wallpaperDirectory = new File("/sdcard/Wallpaper/");
// have the object build the directory structure, if needed.
wallpaperDirectory.mkdirs();
// create a File object for the output file
File outputFile = new File(wallpaperDirectory, filename);
// now attach the OutputStream to the file object, instead of a String representation
FileOutputStream fos = new FileOutputStream(outputFile);

注意:使用Environment.getExternalStorageDirectory()获取“SD 卡”目录可能是明智的,因为如果手机附带的东西不是 SD 卡(例如内置闪存,a'la the苹果手机)。无论哪种方式,您都应该记住,您需要检查以确保它确实存在,因为 SD 卡可能已被移除。

更新:由于 API 级别 4 (1.6),您还必须请求许可。像这样的东西(在清单中)应该可以工作:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
于 2010-01-25T08:33:40.040 回答
57

有同样的问题,只想添加 AndroidManifest.xml 也需要这个权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
于 2010-12-14T03:52:36.087 回答
40

这对我有用。

 uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 

在您的清单和下面的代码中

public static boolean createDirIfNotExists(String path) {
    boolean ret = true;

    File file = new File(Environment.getExternalStorageDirectory(), path);
    if (!file.exists()) {
        if (!file.mkdirs()) {
            Log.e("TravellerLog :: ", "Problem creating Image folder");
            ret = false;
        }
    }
    return ret;
}
于 2011-09-16T02:04:54.117 回答
24

实际上我使用了@fiXedd asnwer 的一部分,它对我有用:

  //Create Folder
  File folder = new File(Environment.getExternalStorageDirectory().toString()+"/Aqeel/Images");
  folder.mkdirs();

  //Save the path as a string value
  String extStorageDirectory = folder.toString();

  //Create New file and name it Image2.PNG
  File file = new File(extStorageDirectory, "Image2.PNG");

确保您使用 mkdirs() 而不是 mkdir() 来创建完整路径

于 2012-04-03T09:17:53.117 回答
12

在 API 8 及更高版本中,SD 卡的位置发生了变化。@fiXedd 的答案很好,但为了更安全的代码,您应该使用Environment.getExternalStorageState()检查媒体是否可用。然后您可以使用getExternalFilesDir()导航到您想要的目录(假设您使用的是 API 8 或更高版本)。

您可以在SDK 文档中阅读更多内容。

于 2011-03-01T15:36:16.537 回答
8

确保存在外部存储:http: //developer.android.com/guide/topics/data/data-storage.html#filesExternal

private boolean isExternalStoragePresent() {

        boolean mExternalStorageAvailable = false;
        boolean mExternalStorageWriteable = false;
        String state = Environment.getExternalStorageState();

        if (Environment.MEDIA_MOUNTED.equals(state)) {
            // We can read and write the media
            mExternalStorageAvailable = mExternalStorageWriteable = true;
        } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            // We can only read the media
            mExternalStorageAvailable = true;
            mExternalStorageWriteable = false;
        } else {
            // Something else is wrong. It may be one of many other states, but
            // all we need
            // to know is we can neither read nor write
            mExternalStorageAvailable = mExternalStorageWriteable = false;
        }
        if (!((mExternalStorageAvailable) && (mExternalStorageWriteable))) {
            Toast.makeText(context, "SD card not present", Toast.LENGTH_LONG)
                    .show();

        }
        return (mExternalStorageAvailable) && (mExternalStorageWriteable);
    }
于 2012-02-29T10:18:24.917 回答
6

不要忘记确保文件/文件夹名称中没有特殊字符。当我使用变量设置文件夹名称时,“:”发生在我身上

文件/文件夹名称中不允许有字符

" * / : < > ? \ |

在这种情况下,您可能会发现此代码很有帮助。

下面的代码删除所有“:”并用“-”替换它们

//actualFileName = "qwerty:asdfg:zxcvb" say...

    String[] tempFileNames;
    String tempFileName ="";
    String delimiter = ":";
    tempFileNames = actualFileName.split(delimiter);
    tempFileName = tempFileNames[0];
    for (int j = 1; j < tempFileNames.length; j++){
        tempFileName = tempFileName+" - "+tempFileNames[j];
    }
    File file = new File(Environment.getExternalStorageDirectory(), "/MyApp/"+ tempFileName+ "/");
    if (!file.exists()) {
        if (!file.mkdirs()) {
        Log.e("TravellerLog :: ", "Problem creating Image folder");
        }
    }
于 2012-06-25T18:28:24.203 回答
6

我遇到了同样的问题。Android中有两种类型的权限:

  • 危险(访问联系人、写入外部存储...)
  • 普通 (普通权限由安卓自动批准,危险权限需要安卓用户批准。)

这是在 Android 6.0 中获取危险权限的策略

  • 检查您是否已授予权限
  • 如果您的应用程序已被授予权限,请继续并正常执行。
  • 如果您的应用还没有权限,请请求用户批准
  • 听取用户批准onRequestPermissionsResult

这是我的情况:我需要写入外部存储。

首先,我检查我是否有权限:

...
private static final int REQUEST_WRITE_STORAGE = 112;
...
boolean hasPermission = (ContextCompat.checkSelfPermission(activity,
            Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
if (!hasPermission) {
    ActivityCompat.requestPermissions(parentActivity,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                REQUEST_WRITE_STORAGE);
}

然后检查用户的认可:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode)
    {
        case REQUEST_WRITE_STORAGE: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                //reload my activity with permission granted or use the features what required the permission
            } else
            {
                Toast.makeText(parentActivity, "The app was not allowed to write to your storage. Hence, it cannot function properly. Please consider granting it this permission", Toast.LENGTH_LONG).show();
            }
        }
    }    
}
于 2015-12-26T15:19:40.663 回答
5

我遇到了同样的问题,无法在 Galaxy S 上创建目录,但能够在 Nexus 和三星 Droid 上成功创建。我如何修复它是通过添加以下代码行:

File dir = new File(Environment.getExternalStorageDirectory().getPath()+"/"+getPackageName()+"/");
dir.mkdirs();
于 2012-02-17T15:48:33.503 回答
5
File sdcard = Environment.getExternalStorageDirectory();
File f=new File(sdcard+"/dor");
f.mkdir();

这将在您的 SD 卡中创建一个名为 dor 的文件夹。然后获取手动插入到dor文件夹中的 eg-filename.json 文件。像:

 File file1 = new File(sdcard,"/dor/fitness.json");
 .......
 .....

< 使用权限 android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

并且不要忘记在清单中添加代码

于 2014-06-09T10:45:46.850 回答
5
     //Create File object for Parent Directory
File wallpaperDir = new File(Environment.getExternalStorageDirectory().getAbsoluteFile() +File.separator + "wallpaper");
if (!wallpaperDir.exists()) {
wallpaperDir.mkdir();
}


File out = new File(wallpaperDir, wallpaperfile);
FileOutputStream outputStream = new FileOutputStream(out);
于 2014-08-14T09:07:43.853 回答
3

刚刚完成了Vijay的帖子......


显现

uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"

功能

public static boolean createDirIfNotExists(String path) {
    boolean ret = true;

    File file = new File(Environment.getExternalStorageDirectory(), path);
    if (!file.exists()) {
        if (!file.mkdirs()) {
            Log.e("TravellerLog :: ", "Problem creating Image folder");
            ret = false;
        }
    }
    return ret;
}

用法

createDirIfNotExists("mydir/"); //Create a directory sdcard/mydir
createDirIfNotExists("mydir/myfile") //Create a directory and a file in sdcard/mydir/myfile.txt

你可以检查错误

if(createDirIfNotExists("mydir/")){
     //Directory Created Success
}
else{
    //Error
}
于 2014-10-28T12:19:33.523 回答
3

这将使用您提供的文件夹名称在 sdcard 中创建文件夹。

File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Folder name");
        if (!file.exists()) {
            file.mkdirs();
        }
于 2016-12-02T06:03:40.290 回答
1
ivmage.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent i = new Intent(
                    Intent.ACTION_PICK,
                    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

            startActivityForResult(i, RESULT_LOAD_IMAGE_ADD);

        }
    });`
于 2016-02-19T07:30:00.927 回答