我正在尝试将我的文件保存到以下位置
FileOutputStream fos = new FileOutputStream("/sdcard/Wallpaper/"+fileName);
,但出现异常java.io.FileNotFoundException
但是,当我将路径设置为"/sdcard/"
有效时。
现在我假设我无法以这种方式自动创建目录。
有人可以建议如何创建directory and sub-directory
使用代码吗?
我正在尝试将我的文件保存到以下位置
FileOutputStream fos = new FileOutputStream("/sdcard/Wallpaper/"+fileName);
,但出现异常java.io.FileNotFoundException
但是,当我将路径设置为"/sdcard/"
有效时。
现在我假设我无法以这种方式自动创建目录。
有人可以建议如何创建directory and sub-directory
使用代码吗?
如果您创建一个包装顶级目录的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" />
有同样的问题,只想添加 AndroidManifest.xml 也需要这个权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
这对我有用。
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;
}
实际上我使用了@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() 来创建完整路径
在 API 8 及更高版本中,SD 卡的位置发生了变化。@fiXedd 的答案很好,但为了更安全的代码,您应该使用Environment.getExternalStorageState()
检查媒体是否可用。然后您可以使用getExternalFilesDir()
导航到您想要的目录(假设您使用的是 API 8 或更高版本)。
您可以在SDK 文档中阅读更多内容。
确保存在外部存储: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);
}
不要忘记确保文件/文件夹名称中没有特殊字符。当我使用变量设置文件夹名称时,“:”发生在我身上
文件/文件夹名称中不允许有字符
" * / : < > ? \ |
在这种情况下,您可能会发现此代码很有帮助。
下面的代码删除所有“:”并用“-”替换它们
//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");
}
}
我遇到了同样的问题。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();
}
}
}
}
我遇到了同样的问题,无法在 Galaxy S 上创建目录,但能够在 Nexus 和三星 Droid 上成功创建。我如何修复它是通过添加以下代码行:
File dir = new File(Environment.getExternalStorageDirectory().getPath()+"/"+getPackageName()+"/");
dir.mkdirs();
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" />
并且不要忘记在清单中添加代码
//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);
刚刚完成了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
}
这将使用您提供的文件夹名称在 sdcard 中创建文件夹。
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Folder name");
if (!file.exists()) {
file.mkdirs();
}
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);
}
});`