Java 文件已存在-名称重复
我正在创建一个文件,当我创建该文件时,我会检查它是否已经存在。如果它已经存在,我想用相同的名称创建它,但后面有(1)。我能够做到这一点,以下是代码: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
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)”作为新文件名李>
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)