java - 无法在内部存储中创建文件夹
问题描述
好吧,我正在尝试在我的内部存储中创建一个文件夹。我看过一些教程,但它根本不起作用。
private void createDir() {
String folderName;
folderName = "myFolder";
File file = new File(Environment.getExternalStorageDirectory(), folderName);
if(!file.exists()){
file.mkdir();
Toast.makeText(getContext(),"Successful", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getContext(),"Folder already exist", Toast.LENGTH_SHORT).show();
}
}
这是我创建新目录的方法。当我启动它时,我一直收到 Toast “Successful”。但是永远不会创建该目录。
就在权限代码的下方。
if(!ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),Manifest.permission.SEND_SMS)){
String[] permissions = {Manifest.permission.WRITE_CALL_LOG,Manifest.permission.SEND_SMS,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.WRITE_CONTACTS,Manifest.permission.READ_SMS};
ActivityCompat.requestPermissions(getActivity(),permissions,1);
}else{
lay_dataset1=view.findViewById(R.id.lay_dataset1);
messagePerm();
}
这是我的清单:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
有人可以解释发生了什么:)
编辑 :
private void copyAssets() {
AssetManager assetManager = getContext().getAssets();
String[] files = null;
try {
files = assetManager.list("");
} catch (IOException e) {
Log.e("tag", "Failed to get asset file list.", e);
}
for(String filename : files) {
InputStream in = null;
OutputStream out = null;
try {
in = assetManager.open(filename);
File outFile = new File(getContext().getExternalFilesDir(null).getParent().replace("files","myfolder"), filename);
out = new FileOutputStream(outFile);
copyFile(in, out);
in.close();
in = null;
out.flush();
out.close();
out = null;
} catch(IOException e) {
Log.e("tag", "Failed to copy asset file: " + filename, e);
}
}
}
private void copyFile(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[1024];
int read;
while((read = in.read(buffer)) != -1){
out.write(buffer, 0, read);
}
}
我试过了,我能够移动“资产”文件夹中与“文件”目录相同级别的文件,那么为什么我不应该有权在同一位置创建文件夹?
解决方案
第一次运行应用程序时,应用程序外部存储目录Android/data/<package.name>/files
不会创建,直到您调用此方法getExternalFilesDir(null)
两次。
所以试试这个代码..
//Essential for creating the external storage directory for the first launch
getExternalFilesDir(null);
/*
output->> /storage/emulated/0/Android/data/<package.name>/files
*/
Log.i("HINT",getExternalFilesDir("").getAbsolutePath());
//Or create your custom folder
File outFile = new File(getExternalFilesDir(null).getParent(),"myfolder");
//make it as it is not exists
outFile.mkdirs();
/*
output->> /storage/emulated/0/Android/data/<package.name>/myfolder
*/
Log.i("HINT",outFile.getAbsolutePath());
推荐阅读
- arrays - 为什么我的 C 程序给我奇怪的输出?
- r - 如何使用 rvest 抓取网页的链接和文本?
- javascript - JavaScript:如何在类外的映射器中使用 new 关键字初始化类对象?
- c++ - 桶排序还是归并排序?
- php - VS Code HTML 和 JS 语法高亮/智能感知 PHP 中的字符串
- javascript - 通过标签动态删除画布元素
- f# - F# - 字符串 | 对联合的 int 推断
- python - 如何使用“for”和“recrusive function”制作算法来制作“u list”?
- php - MySQL PDO 准备语句错误地更新列
- r-markdown - 使用包`vtable`编译RMarkdown pdf文件时出错