Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android File.rename在我的测试设备中始终返回false_Java_Android - Fatal编程技术网

Java Android File.rename在我的测试设备中始终返回false

Java Android File.rename在我的测试设备中始终返回false,java,android,Java,Android,我正在尝试重命名文件以添加扩展名。我正在检测文件的类型,并希望将扩展名附加到文件。这一切都很好,但我有一个索尼Xperia Z2进行测试,奇怪的事情发生了。在其他设备和模拟器中,工作起来很有魅力,但在这一款中。。。这是不可能的 它总是返回false,尽管它在父文件夹中有写权限,但它是同一个文件夹,并且它只附加了一个“.jpg”或“.png”之类的内容。由于File.renameTo函数没有给出任何错误,只需抛出false,我无法确定是否只有我。。。但我开始相信,这与it如何管理内部/外部存储有关

我正在尝试重命名文件以添加扩展名。我正在检测文件的类型,并希望将扩展名附加到文件。这一切都很好,但我有一个索尼Xperia Z2进行测试,奇怪的事情发生了。在其他设备和模拟器中,工作起来很有魅力,但在这一款中。。。这是不可能的

它总是返回false,尽管它在父文件夹中有写权限,但它是同一个文件夹,并且它只附加了一个“.jpg”或“.png”之类的内容。由于
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)
新文件(parent.getAbsolutePath().toString()+“/”+toName)-请不要这样做!我已经阅读了文档,但我在该目录中有写权限(我测试了它,在父文件夹中canWrite()返回true),两个路径都在同一文件夹中,并且。。。我不知道“搜索权限”指的是什么。我到处都找不到它。。。但我不认为是这样,因为我测试了我发现的唯一东西:清单中的全局搜索权限。此外,文件路径不是问题所在。File nf=新文件(parent.getCanonicalPath()+toName);这不好,还有一种方法可以重命名文件。将旧文件复制到具有新名称的新文件,然后删除该旧文件。我编写此方法已有多年。@MehdiJahedManesh我曾想过该解决方法,但。。。在这种情况下,我认为这不是正确的方法。假设我需要移动一个1GB的文件。。。在智能手机存储空间有限的情况下,这可能是一个大问题。
File f1 = new File(parent.getAbsolutePath().toString()+ "/" +toName);