Java 文件已存在-名称重复

Java 文件已存在-名称重复,java,android,performance,file,io,Java,Android,Performance,File,Io,我正在创建一个文件,当我创建该文件时,我会检查它是否已经存在。如果它已经存在,我想用相同的名称创建它,但后面有(1)。我能够做到这一点,以下是代码: File apkReceived = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/"+receivedApkName + ".apk"); if(apkR

我正在创建一个文件,当我创建该文件时,我会检查它是否已经存在。如果它已经存在,我想用相同的名称创建它,但后面有(1)。我能够做到这一点,以下是代码:

    File apkReceived = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/"+receivedApkName + ".apk");
                        if(apkReceived.exists()){
                         apkReceived=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/"+receivedApkName + "(1)"+".apk");
                        }
                        byte[] buffer = new byte [8192];
                        FileOutputStream fos=new FileOutputStream(apkReceived);
然后它会继续。。。(我正在文件上写东西)

这是可行的,但问题是在这种情况下:

FileTest.apk

文件测试(1).apk

如果我收到另一个Filetest,它将子文件测试(1),因为它将再次创建它。 解决这个问题的一个方法是检查文件是否再次存在,但是我必须永远这样做

我的目标是创建(1)和(2),等等。 你们有谁知道怎么做吗


编辑:显然我可以用圆环来检查一下。问题在于如何获得(1)和(2),而不获得(1)(2)

一些伪代码来启动:

  • 获取目录中所有文件的列表
  • 对于要复制的副本:检查是否已有一份或多份副本
  • 如果您已经有“文件(n)”;使用“文件(n+1)”作为新文件名
显然:你应该澄清你对你想要允许的“最大”n的要求;以及创建n个副本时会发生什么;还有一个是要的。

试试这个

String filename =Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/"+receivedApkName + ".apk";
File f = new File(filename);
String extension = ".apk";
int g = 0;

while(f.exists()) {
  int i = f.lastIndexOf('.');
  if (i > 0) 
     { extension = fileName.substring(i+1); }

   f.renameTo(f.getPath() + "\" + (f.getName() + g) + "." + extension)    
}

如果在目录中仅存储一种类型的文件,则可以执行以下操作:

File folder = new File("your/path");
File[] listOfFiles = folder.listFiles();
计算下一个文件名的大小和大小+1


您还可以在各自的目录中使用相似的文件名分隔每个文件。

为了避免重新发明轮子,我建议使用
时间戳
它几乎不会发生冲突

java.util.Date date= new java.util.Date();
Timestamp tstamp = new Timestamp(date.getTime());
File apkReceived = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/"+receivedApkName + tstamp + ".apk");

像这样做

 File apkReceived = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/"+receivedApkName + ".apk");

                if(apkReceived.exists()){

                    int new_int_postfix;

                    //Below _MAX is max numbers of file eg. _MAX = 100 
                    for(int i = 1; i < _MAX; i++) {

                    apkReceived = = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/"+receivedApkName +"("+ i +")"+".apk");
                        if(!apkReceived.exists()) {
                            String []name_without_pre = receivedApkName.split("\\(");
                            receivedApkName = name_without_pre[0];
                            new_int_postfix = i;
                            break;

                        }
                    }

                 apkReceived = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/"+receivedApkName + "("+new_int_postfix+")"+".apk");
                }

                byte[] buffer = new byte [8192];

                FileOutputStream fos=new FileOutputStream(apkReceived);
File apkReceived=新文件(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_下载)+“/”+receivedapname+”.apk”);
如果(apkReceived.exists()){
int new_int_后缀;
//在_MAX下面是文件的最大数量,例如_MAX=100
对于(int i=1;i<\u MAX;i++){
apkReceived==新文件(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_下载)+“/”+receivedapname+”(“+i+”)+.apk”);
如果(!apkReceived.exists()){
字符串[]name\u不带\u pre=receivedAppKname.split(“\\(”);
receivedAppKname=name_,不带_pre[0];
new_int_postfix=i;
打破
}
}
apkReceived=新文件(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)+“/”+receivedAppkname+”(“+new_int_postfix+”)”)+“.apk”);
}
字节[]缓冲区=新字节[8192];
FileOutputStream fos=新的FileOutputStream(apkReceived);

但是我必须永远这样做。
不。只要简单的while循环就可以检查那些文件是否存在。哇。这是一个非常愚蠢的问题。我甚至感到尴尬。对不起。我已经37个小时没睡了。我非常抱歉。原则上你可以将
if(apkReceived.exists()
更改为
while(apkReceived.exists()
。然后使用一个
数字变量,以便为(1)计算(数字)。
所有6个答案都太复杂。问题是,在循环的第二次运行时,它将检查FileTest(1).apk是否已经存在,这是可以的,但随后它将创建一个FileTest(1)(2).apk.在Marcin告诉我关于cicle的事(我显然是“醒来”)并照你说的做了之后,但我会说filetest(1)(2)一个字也不懂。这不会有任何问题。但是因为你已经检查了答案,所以这篇文章就结束了。那就是:filetest.apk filetest(1)。apk filetest(1)(2).apkYeah,关键是ReceivedAppKname…谢谢!这将帮助我创建(1)、(2)而不是(1)(2),因为我可以将现有文件的名称替换为子字符串,这样我可以先创建(1)然后创建(2)