2016-08-22 3 views
-1

ファイルを作成していますが、そのファイルを作成するときにはすでに存在するかどうかを確認します。既に存在する場合は、同じ名前で作成したいが、後に(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(1)それはそれを再び作成するからです。 これを解決する方法は、ファイルが再度存在するかどうかを確認することですが、その後はこれを常に実行しなければなりません。

私の目標は、(1)と(2)などを作成することです。 あなたはこれを行う方法を知っていますか?

EDIT:確かに私はそれをチェックするためにシクルを使用することができます。問題は、(1)を取得する方法にあり、その後、(2)及び(1)(2)

+0

ような何かを行う 'が、ループはそれらのファイルが存在するかどうかを確認するために行うだろうが、その後私は、単純なever.'号のためにそれをやってしなければならないであろう。 – greenapps

+0

うわー。これは本当にばかげた質問でした。私も恥ずかしいです。ごめんなさい。私は37時間で眠れない。非常に残念です。 –

+0

あなたは 'if(apkReceived.exists()'を 'while(apkReceived.exists()'に変更することができます。そして '(number)をconstruntできるように' number変数を使います。'6つの答えはすべて複雑すぎる。 – greenapps

答えて

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

そうするでしょう: FileTest.apk FileTest(1).apk FileTest(1)(2).apk –

+0

私はコードを編集しました。 – Abhishek

+0

ええ、鍵はreceivedApkNameでした...ありがとう! –

1

あなたが始めるためにいくつかの擬似コードを取得していない:

  • はのリストを取得しますディレクトリ内のすべてのファイル
  • コピーするファイルのコピー:既に1つ以上のコピーがあるかどうかを確認してください。
  • "file_(n)"がすでにある場合は、新しいファイル名として "file_(n + 1)"を使用してください。

明らかに、あなたが許可したい "最大限"の要件を明確にする必要があります。 n個のコピーが作成されたときにどうなるか。もう1人が尋ねられます。

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

があなたの次のファイル名のサイズとサイズ+ 1を数える:あなただけのディレクトリ内のファイルの一つのタイプは、あなたが行うことができます保存している場合

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

を試してみてください。

また、それぞれのファイルをそれぞれのディレクトリにある同じファイル名で区切ることもできます。

+0

これは、(1)(2)の代わりに(1)、(2)を作成するのに役立ちます。 ) –

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