Android文件重命名File.renameTo()以及定义副本名方法(自定义规

项目需求

做文件管理相关项目有个需求需要对单个或多个文件进行重命名,这就可能会出现名称重复的情况;还有复制的时候,如果粘贴的地方已存在相同名称文件,也需要进行重命名。

相仿思想:

我们知道在电脑上复制粘贴同一文件(夹)到同一路径下的时候,系统会帮我们自动生成新的副本(Copy)名

比如: 我.png MAC是文件名 + ” ” + 数字递增 + 后缀 (我 1.png) Windows是文件名 + ” – 副本”+ ” (” + 数字递增 + “)” + 后缀 (我 -副本(2).png)

而在电脑上重命名时,如果该路径下已有该名称文件,则会提示(警告)用户并不允许进行重命名。

知识点

本节将讲解的内容有: 1.如何调用File固有方法去进行本地文件重命名 2.需要新建副本名时,该怎么用自定义规则进行重命名

代码分析

根据需求,我们可以定义接口重命名 public boolean rename(FileInfo fileInfo, String newName);

其中FileInfo是自定义数据结构,里面包含fileName(文件名),filePath(文件路径),isDir(是否是目录)等信息。 参数newName是新的文件名(包含后缀)

/*** @Description 对文件进行重新命名* @param fileInfo 原始文件信息* @param newName 新名称(有后缀)* @param admitCopyName 当命名冲突时,是否允许生成副本名(如果是多选重命名的话,是需要允许的;单个文件重命名则设置为不允许)* @return 是否修改成功*/(FileInfo fileInfo, String newName, boolean admitCopyName) {//1.判断参数阈值if (fileInfo == null || newName == null) {Log.e(LOG_TAG, “Rename: null parameter”);return false;}//2.得到原文件全路径String oldPath = fileInfo.getFilePath();Log.d(LOG_TAG, “Rename—original path = ” + oldPath));//3-1.得到文件所在路径String rootPath = Util.getPathFromFilepath(oldPath); //Util.getPathFromFilepath(String)-自定义方法:得到文件所在路径(即全路径去掉完整文件名)//3-2.得到新全路径String newPath = Util.makePath(rootPath, newName); //Util.makePath(String, String)-自定义方法:根据根路径和文件名形成新的完整路径Log.d(LOG_TAG, “Rename—new Path = ” + newPath);;}try {//5.根据新路径得到File类型数据File newFile = new File(newPath);; //重命名失败}//7.循环判断直到生成可用的副本名while (newFile.exists()) {Log.w(LOG_TAG, “Rename—新文件路径名称已存在文件 —” + newPath);//重命名重名定义规范–Util.getCopyNameFromOriginal(String)-自定义方法:根据自定义规则生成原名称副本newPath = Util.getCopyNameFromOriginal(newPath);newFile = new File(newPath);Log.i(LOG_TAG, “Rename—new copy Path = ” + newPath);}//8.得到原文件File类型数据File file = new File(oldPath);//9.调用固有方法去重命名boolean ret = file.renameTo(newFile);Log.i(LOG_TAG, “Rename—改名成功? ” + ((ret) ? “yes!” : “no!”));if (ret) {//FIXME:这里通过更改形参来改变实参,是不好的写法,不建议这样写!fileInfo.setFileName(Util.getNameFromFilepath(newPath)); //更新文件名fileInfo.setmFilePath(newPath); //更新新路径}return ret;} catch (SecurityException e) {Log.e(LOG_TAG, “Fail to rename file,” + e.toString());}return false;}分步讲解中心内容

代码量看起来有点长,其实中心就一句,就是第9步中的file.renameTo(newFile);

这是调用File的固有重命名方法,其用法如下

//oldPath like “mnt/sda/sda1/我.png”File file = new File(oldPath); //newPath like “mnt/sda/sda1/我的照片.png”file.renameTo(new File(newPath));

需要注意的是:

第一,如果是Android的SD卡上的文件重命名,那么必须添加权限:

<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE” />

第二,oldPath和newPath必须是新旧文件的绝对路径

第三,如果newPath已经存在文件,不做任何处理的话,调用此方法会把已存在的文件覆盖掉。

意思是:比如我在”mnt/sda/sda1/”路径下有两张照片,一个叫”我.png”,一个叫”我的照片.png”,这个时候我用file.renameTo(new File(newPath));把”我.png”重命名为”我的照片.png”,那么原来存在的”我的照片.png”会被重命名后的”我.png”覆盖。

注:第三点确实是我实践后总结出来的,但是没有进行过大量的验证,若有不对的地方,还望指教。

第四,在网上看到一些人为了测试renameTo的用法,直接在没有实体文件的情况下,就创建路径,然后进行重命名。

File t1 = new File(“D:” + File.separatorChar + “final.java”);File t2 = new File(“D:” + File.separatorChar + “finalaa.java”);System.out.println(“是否重命名成功:” + t1.renameTo(t2)); //输出false

需注意的是,new File(filePath)得到的是一个路径,并不是一个实体文件!当你文件都没有创建的时候,怎么可能对一个不存在的文件进行重命名呢?

如下解释我觉得更好理解

我的理解是new File(String path)并没有创建文件本身,只是说我可能要在这个路径创建文件。

t1被创建以后(调用了createNewFile),文件就实实在在地在那里了,重命名为finalaaa.java以后,文件还是t1这个文件,只是路径改变了,从而使名字变了。

由始至终只有一个文件(也就是说t2只是把地方标出来了,并没有得到创建,当t1想占用t2的地盘的时候,t2让给了t1)

辅助方法

可以看到重命名方法里调用了许多我自定义的辅助方法, 如3-1步

Util.getPathFromFilepath(oldPath); //得到文件所在路径(即全路径去掉完整文件名)

3-2步

Util.makePath(rootPath, newName); //根据根路径和文件名形成新的完整路径

第7步

Util.getCopyNameFromOriginal(newPath); //根据自定义规则生成原名称副本影子依旧可以相亲相爱。哪一块骨骼最温暖,总能一击即中。

Android文件重命名File.renameTo()以及定义副本名方法(自定义规

相关文章:

你感兴趣的文章:

标签云: