• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:Backup Fileを番号付きで作成
#navi(../)
RIGHT:Posted by [[terai]] at 2003-10-07
*Backup Fileを番号付きで作成 [#da6c5825]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2003-10-07~
更新日:&lastmod;

#contents

**概要 [#h2d72f39]
[[xyzzy]]風の番号付きバックアップファイルを作成します。

//-&jnlp;
-&jar;
-&zip;

#screenshot

**サンプルコード [#dbcb1005]
#code{{
 private File makeBackupFile(File file, int intold, int intnew) {
   File testFile = null;
   String newfilename = file.getAbsolutePath();
   if(intold==0 && intnew==0) {
     file.delete();
     return new File(newfilename);
   }
   boolean testFileFlag = false;
   for(int i=1;i<=intold;i++) {
     testFile = new File(file.getParentFile(), file.getName()+"."+i+"~");
     if(!testFile.exists()) {
       testFileFlag = true;
       break;
     }
   }
   if(!testFileFlag) {
     for(int i=intold+1;i<=intold+intnew;i++) {
       testFile = new File(file.getParentFile(), file.getName()+"."+i+"~");
       if(!testFile.exists()) {
         testFileFlag = true;
         break;
       }
     }
   }
   if(testFileFlag) {
     System.out.println("createBKUP1"+testFile.getAbsolutePath());
     file.renameTo(testFile);
   }else{
     File tmpFile3 = new File(file.getParentFile(),
                              file.getName()+"."+(intold+1)+"~");
     tmpFile3.delete();
     for(int i=intold+2;i<=intold+intnew;i++) {
       File tmpFile1 = new File(file.getParentFile(),
                                file.getName()+"."+i+"~");
       File tmpFile2 = new File(file.getParentFile(),
                                file.getName()+"."+(i-1)+"~");
       tmpFile1.renameTo(tmpFile2);
     }
     File tmpFile = new File(file.getParentFile(),
                             file.getName()+"."+(intold+intnew)+"~");
     System.out.println("changeBKUP2"+tmpFile.getAbsolutePath());
     file.renameTo(tmpFile);
   }
   //System.out.println(newfilename);
   return new File(newfilename);
 }
private File makeBackupFile(File file, int intold, int intnew) {
  File testFile = null;
  String newfilename = file.getAbsolutePath();
  if(intold==0 && intnew==0) {
    file.delete();
    return new File(newfilename);
  }
  boolean testFileFlag = false;
  for(int i=1;i<=intold;i++) {
    testFile = new File(file.getParentFile(), file.getName()+"."+i+"~");
    if(!testFile.exists()) {
      testFileFlag = true;
      break;
    }
  }
  if(!testFileFlag) {
    for(int i=intold+1;i<=intold+intnew;i++) {
      testFile = new File(file.getParentFile(), file.getName()+"."+i+"~");
      if(!testFile.exists()) {
        testFileFlag = true;
        break;
      }
    }
  }
  if(testFileFlag) {
    System.out.println("createBKUP1"+testFile.getAbsolutePath());
    file.renameTo(testFile);
  }else{
    File tmpFile3 = new File(file.getParentFile(),
                             file.getName()+"."+(intold+1)+"~");
    tmpFile3.delete();
    for(int i=intold+2;i<=intold+intnew;i++) {
      File tmpFile1 = new File(file.getParentFile(),
                               file.getName()+"."+i+"~");
      File tmpFile2 = new File(file.getParentFile(),
                               file.getName()+"."+(i-1)+"~");
      tmpFile1.renameTo(tmpFile2);
    }
    File tmpFile = new File(file.getParentFile(),
                            file.getName()+"."+(intold+intnew)+"~");
    System.out.println("changeBKUP2"+tmpFile.getAbsolutePath());
    file.renameTo(tmpFile);
  }
  //System.out.println(newfilename);
  return new File(newfilename);
}
}}
//-&jnlp;
-&jar;
-&zip;

**解説 [#xf457df5]
上記のサンプルでは、[[xyzzy]]風の番号付きバックアップのテストを行っています。

以下の例では、古いバージョンを2つ、新しいバージョンを3つバックアップとして残します。
-tmp.foo.1~ から tmp.foo.5~ が残される
-tmp.foo.1~ がもっとも古いバージョンのファイルになる

バックアップファイルが5個以上になった場合、古い方のバージョン2つはそのまま残し、新しいバージョンをずらしてバックアップが更新されます。
-tmp.foo.1~, tmp.foo.2~ は残される
-tmp.foo.3~は削除される
-tmp.foo.4~ はtmp.foo.3~にリネーム
-tmp.foo.5~ はtmp.foo.4~にリネーム
-tmp.foo.5~ が新にバックアップとして生成される

 File tmpFile = File.createTempFile("tmp", ".foo~", file.getParentFile());
 File file = makeBackupFile(file, 2, 3);
 tmpFile.renameTo(file);
#code{{
File tmpFile = File.createTempFile("tmp", ".foo~", file.getParentFile());
File file = makeBackupFile(file, 2, 3);
tmpFile.renameTo(file);
}}

**コメント [#c2bd4ac8]
#comment