解答:
Needed the call to getExternalFilesDir(p);
喜欢这样:
String p = thepathblah;
File path=context.getExternalFilesDir(p);
编辑编辑:
虽然我知道Environment.DIRECTORY_PICTURES
只返回Pictures/
我觉得这很有效,因为在android中我假设文件指针已经指向你的应用程序空间(在c#中排序)。所以在这:
String p = Environment.DIRECTORY_PICTURES + "/" + s.getClient().getFirstName()+s.getClient().getLastName() +
"/" + s.getPackage().getName() +
(mSession.getSessionDate().getMonth()+1) +
mSession.getSessionDate().getDate() +
(mSession.getSessionDate().getYear()+1900);
我认为是完整的路径,事实上我正在写一个文件,没有任何问题。事实证明,删除单个文件(并加载它们)我需要一个更全面的路径,最终成为:
String p = Environment.DIRECTORY_PICTURES + "/" + s.getClient().getFirstName()+s.getClient().getLastName() +
"/" + s.getPackage().getName() +
(mSession.getSessionDate().getMonth()+1) +
mSession.getSessionDate().getDate() +
(mSession.getSessionDate().getYear()+1900);
File dir = new File("/sdcard/Android/data/com.software.oursoftware/files/"+p);
我不确定我是否可以认为上述链接对所有Honeycomb设备都有效,特别是/sdcard/Android/data/packagespace/files/
使用它是否安全,或者我必须为蜂窝设备做更动态的事情吗?
编辑:这是我的小测试功能代码,只是写一些文件夹...
String p = Environment.DIRECTORY_PICTURES + "/" + s.getClient().getFirstName()+s.getClient().getLastName() + "/" + s.getPackage().getName() + (mSession.getSessionDate().getMonth()+1) + mSession.getSessionDate().getDate() + (mSession.getSessionDate().getYear()+1900);
File path = mContext.getExternalFilesDir(p);
File file = new File(path, "DemoPicture.jpg");
try {
// Very simple code to copy a picture from the application's
// resource into the external file. Note that this code does
// no error checking, and assumes the picture is small (does not
// try to copy it in chunks). Note that if external storage is
// not currently mounted this will silently fail.
InputStream is = getResources().openRawResource(R.drawable.ic_contact_picture);
OutputStream os = new FileOutputStream(file);
byte[] data = new byte[is.available()];
is.read(data);
os.write(data);
is.close();
os.close();
// Tell the media scanner about the new file so that it is
// immediately available to the user.
MediaScannerConnection.scanFile(mContext,
new String[] { file.toString() }, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String arg0, Uri arg1) {
Log.i("ExternalStorage", "Scanned " + arg0 + ":");
Log.i("ExternalStorage", "-> uri=" + arg1);
}
});
} catch (IOException e) {
// Unable to create file, likely because external storage is
// not currently mounted.
Log.w("ExternalStorage", "Error writing " + file, e);
}
然后我尝试删除此文件夹的方式:
String p = Environment.DIRECTORY_PICTURES + "/" + firstName+lastName +"/" + pName+pDate;
File dir=new File(p);
deleteRecursive(dir);
结果
Pictures/ShaneThomas/Portrait882011/
哪个可以写一个文件,经过测试,但如果我试着说:
void deleteRecursive(File dir)
{
Log.d("DeleteRecursive", "DELETEPREVIOUS TOP" + dir.getPath());
if (dir.isDirectory())
{
String[] children = dir.list();
for (int i = 0; i < children.length; i++)
{
File temp = new File(dir, children[i]);
if(temp.isDirectory())
{
Log.d("DeleteRecursive", "Recursive Call" + temp.getPath());
deleteRecursive(temp);
}
else
{
Log.d("DeleteRecursive", "Delete File" + temp.getPath());
boolean b = temp.delete();
if(b == false)
{
Log.d("DeleteRecursive", "DELETE FAIL");
}
}
}
dir.delete();
}
}
dir.isDirectory总是假的!?我有这个删除文件/目录代码关闭堆栈溢出但很困惑为什么它不工作?
我确实有这套:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
答案 0 :(得分:2)
File.isDirectory()
返回false有几个原因:
通常,如果isDirectory()
返回true,则表示您有指向目录的路径。但是如果isDirectory()
返回false,那么它可能是也可能不是目录。
在您的特定情况下,路径很可能不存在。您需要调用dir.mkdirs()
来创建路径中的所有目录。但是,由于您只需要递归删除它们,因此在此之后调用dir.mkdirs()
只是删除该目录是没有意义的。
答案 1 :(得分:1)
我想你要添加
在dir.mkdirs()
之后 File dir=new File(p)
。 mkdirs()是负责实际创建目录的方法,而不是新的File()。
答案 2 :(得分:1)
好的,它得到了回答,但有时问题是由于样本的重新启动:许可:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
如果您忘记了此权限,您将永远得到错误的结果。