Java Android File.rename在我的测试设备中始终返回false
我正在尝试重命名文件以添加扩展名。我正在检测文件的类型,并希望将扩展名附加到文件。这一切都很好,但我有一个索尼Xperia Z2进行测试,奇怪的事情发生了。在其他设备和模拟器中,工作起来很有魅力,但在这一款中。。。这是不可能的 它总是返回false,尽管它在父文件夹中有写权限,但它是同一个文件夹,并且它只附加了一个“.jpg”或“.png”之类的内容。由于Java Android File.rename在我的测试设备中始终返回false,java,android,Java,Android,我正在尝试重命名文件以添加扩展名。我正在检测文件的类型,并希望将扩展名附加到文件。这一切都很好,但我有一个索尼Xperia Z2进行测试,奇怪的事情发生了。在其他设备和模拟器中,工作起来很有魅力,但在这一款中。。。这是不可能的 它总是返回false,尽管它在父文件夹中有写权限,但它是同一个文件夹,并且它只附加了一个“.jpg”或“.png”之类的内容。由于File.renameTo函数没有给出任何错误,只需抛出false,我无法确定是否只有我。。。但我开始相信,这与it如何管理内部/外部存储有关
File.renameTo
函数没有给出任何错误,只需抛出false,我无法确定是否只有我。。。但我开始相信,这与it如何管理内部/外部存储有关。内部存储器实际上是sdcard0,外部存储器是sdcard1。有些应用程序,如ES File Manager,会询问我的SD卡的根目录,以便它可以重命名、移动或复制我的SD卡中的文件。航空机器人让我做同样的事情。为什么会这样?我怎样才能解决这个问题
哦,我在清单中有相关的权限,我一直在搜索修复程序。。。而且在内部存储中也不起作用。我完全迷路了。这是我用来重命名文件的函数,如果它有助于某人。。。但我认为这是“内部SD卡”设备的问题
private void setFixed(File f, String ext){
File parent = f.getParentFile();
try {
String name = f.getName();
String toName = (name+"."+ext).replace(" ", "");
//Lines that I added just to test. I saw before I call this function that the parent has write permission.
//Log.i("Pre", parent.getCanonicalPath()+name);
//Log.i("Post", parent.getCanonicalPath()+toName);
//File of = new File(parent.getCanonicalPath()+name);
//File nf = new File(parent.getCanonicalPath()+toName);
//Log.i("Converted", String.valueOf(of.renameTo(nf)));
File f1 = new File(parent.getAbsolutePath()+toName);
boolean success = f.renameTo(f1);
Log.i("File renamed?", String.valueOf(success));
} catch (Exception e) {
e.printStackTrace();
}
}
非常感谢 请阅读
重命名为(文件)
的文档(单击方法并按ctrl+Q)
将此文件重命名为newPath。这两个系统都支持此操作
文件和目录。许多失败是可能的。更多
可能的失败包括:在上需要写入权限
包含源路径和目标路径的目录。搜寻
两个路径的所有父级都需要权限。两条路都通
相同的挂载点。在Android上,应用程序最有可能受到攻击
尝试在内部存储器和外部存储器之间复制时,此限制
SD卡。请注意,此方法不会在上引发IOException
失败。调用者必须检查返回值
如您所见,搜索权限是必需的。请确保将其添加到清单中
你也需要改变
File f1=新文件(parent.getAbsolutePath()+toName)代码>
到
你在测试什么Android版本?4.4和5.1,5.1是模拟器(它在那里工作)和我的索尼设备(问题出在哪里…),在4.3和4.4之间,然后在4.4和5.0之间,应用程序访问外部SD卡(“辅助外部存储”)的方式发生了变化,请参见示例Ohh。。。所以,现在我明白为什么它会在其他应用程序中问我了。但我认为这仍然不是问题所在,因为我也无法访问内部存储。我的朋友用4.4安卓设备测试了它。。。工作起来很有魅力。不过,谢谢你提供的信息<代码>新文件(parent.getAbsolutePath()+toName)如果getAbsolutePath()
不包含尾随分隔符,则code>也可能会导致问题。尝试新文件(父文件,toName)改为code>。新文件(parent.getAbsolutePath().toString()+“/”+toName)代码>-请不要这样做!我已经阅读了文档,但我在该目录中有写权限(我测试了它,在父文件夹中canWrite()返回true),两个路径都在同一文件夹中,并且。。。我不知道“搜索权限”指的是什么。我到处都找不到它。。。但我不认为是这样,因为我测试了我发现的唯一东西:清单中的全局搜索权限。此外,文件路径不是问题所在。File nf=新文件(parent.getCanonicalPath()+toName);这不好,还有一种方法可以重命名文件。将旧文件复制到具有新名称的新文件,然后删除该旧文件。我编写此方法已有多年。@MehdiJahedManesh我曾想过该解决方法,但。。。在这种情况下,我认为这不是正确的方法。假设我需要移动一个1GB的文件。。。在智能手机存储空间有限的情况下,这可能是一个大问题。
File f1 = new File(parent.getAbsolutePath().toString()+ "/" +toName);