【问题标题】:File already existing - repeated name文件已存在 - 重复名称
【发布时间】:2016-12-28 22:51:58
【问题描述】:

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

然后它会继续......(我在文件上写东西)。

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

文件测试.apk

FileTest(1).apk

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

我的目标是创建 (1) 然后 (2) 等。 有没有人知道怎么做?

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

【问题讨论】:

  • but then i would have to be doing that for ever. 不。只需一个简单的 while 循环即可检查这些文件是否存在。
  • 哇。这是一个非常愚蠢的问题。我什至感到尴尬。我很抱歉。我已经37小时没睡了。非常抱歉。
  • 原则上您可以将if(apkReceived.exists() 更改为while(apkReceived.exists()。然后使用number variable so you can construnt (number) for (1). 6 个答案都太复杂了。
  • 问题在于,在第二次运行 cicle 时,它​​会检查 FileTest(1).apk 是否已经存在,这没问题,但随后它会创建一个 FileTest(1)( 2).apk。在 Marcin 告诉我有关 cicle 的事情(我显然“醒了”)并按照你说的做之后,但我会在 filetest(1)(2)
  • 一个字都不懂。不会有任何问题。但是由于您已经检查了答案,因此该帖子已关闭。

标签: java android performance file io


【解决方案1】:

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

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

显然:您应该明确您对“最大”n 的要求,您希望允许;以及当创建 n 个副本时会发生什么;并要求另一个。

【讨论】:

    【解决方案2】:

    试试这个

    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】:

      如果你只在你的目录中存储一种类型的文件,你可以这样做:

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

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

      您还可以将具有相似文件名的每个文件分开放在自己的目录中。

      【讨论】:

      • 这将帮助我创建 (1), (2) 而不是 (1)(2) ,因为我可以对现有文件的名称进行子串化,这样我就可以做到 ( 1) 然后是 (2)
      【解决方案4】:

      为了避免重新发明轮子,我建议使用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");
      

      【讨论】:

        【解决方案5】:

        做这样的事情

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

        【讨论】:

        • 这样:FileTest.apk FileTest(1).apk FileTest(1)(2).apk
        • 是的,关键是收到的ApkName...谢谢!
        猜你喜欢
        • 2023-04-06
        • 2019-02-04
        • 2019-08-14
        • 1970-01-01
        • 2019-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-18
        相关资源
        最近更新 更多