文件已存在 - 重复名称

时间:2016-08-22 11:42:36

标签: java android performance file io

我正在创建一个文件,当我创建该文件时,我会检查它是否已经存在。如果它已经存在,我想用相同的名称创建它,但在它之后使用(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

FileTest(1)的apk

如果我收到另一个Filetest,它会将我的FileTest(1)分开,因为它会再次创建它。 对此的解决方案是检查文件是否再次存在,但是我必须永远这样做。

我的目标是创建(1)然后(2)等。 你们其中任何一个人都知道怎么做吗?

编辑:显然我可以使用cicle来检查它。问题是如何得到(1)然后得到(2)而得不到(1)(2)

5 个答案:

答案 0 :(得分:2)

为了避免重新发明轮子,我建议使用Timestamp它几乎不会发生碰撞。

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");

答案 1 :(得分:1)

一些伪代码可以帮助您入门:

  • 获取目录中所有文件的列表
  • 对于您要复制的那个:检查您是否已有一个或多个副本
  • 如果您已经有“file_(n)”;使用“file_(n + 1)”作为新文件名。

显然:你应该澄清你对你想要允许的“最大”n的要求;以及创建n份副本时会发生什么;另一个被要求。

答案 2 :(得分:1)

试试这个

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)    
}

答案 3 :(得分:1)

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

File folder = new File("your/path");
File[] listOfFiles = folder.listFiles();

计算下一个文件名的大小和大小+1。

您也可以在自己的目录中使用类似的文件名分隔每个文件。

答案 4 :(得分:1)

做这样的事

 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);