ROOT의 하위 디렉터리는 여러개 있지만, 그 하위 디렉터리 안에는 다른 하위 디렉터리가 없을 때 renameTo 를 이용한 파일 이동 구현.

 

만든 이유는..

파일이 만들어지는 곳에서 바로 다른 곳으로 샌딩을 해야하는데, 가끔 서버의 속도가 느려져 파일생성이 완료되기 전에 데몬이 작동하면 뻑~ 이나는 문제가 발생.

(이딴 편법을 쓰기보다는 해당 데몬을 새로 만드는게 더 나을지도 모르겠다.)

 

일단 임시로 만든 디렉터리 공간에 파일을 생성하고 그것을 파일샌더가 작동되는 공간으로 옮기기로 했다.

(다 필요없고 dirFileMov()만 있으면 되지만.. 테스트 할때는 파일이 쌓이니까 renameTo로는 이동이 되지않는 문제가 발생.. 부득이하게 테스트를 위한 메소드를 만들어야 했다. 배보다 배꼽이 더 큰 ㅎ...)

 

디렉터리 하나에 파일만 여러개 있는 구조라(구조가 변할확율 거의 없음..) 추출과정에서 불필요한 loop가 많아지는 것 같아 회전 수를 줄이는 대신에 기능을 나눠서 메소드화 했다고 스스로 정신승리 함...

본래 fileMovNew()와 dirFileMov()는 디렉터리와 파일을 구분해서 추출할 때, 재귀호출을 통해서 만들려고 했고, 그 과정에서 chkTmpDir()와 chkOutDir()는 추출 횟수를 줄일려고 고안한건데 오히려 불필요 해졌다.

메소드 하나로 만들어도 그만이지만.. 

이제와서 구조를 바꾸기는 귀찮고, 새로 만드는 과정에서 남은 잔재들을.. 그냥 활용하기로 함.

(저렇게 쪼개두면 각자 언젠가는 쓰일.. 일이 있겠지..)

 

원본경로 안에는 생성되는 파일이 몇개뿐이지만, 타켓이 되는 경로에는 적개는 수백개에서 많게는 수백만개의 파일이 쌓여있을 수 있다고 과정하고.. 필터링 후 검색을 최소화해야 하는데.. 필터링 정규식 만들기도 귀찮고 복잡해서 간단하게 처리.

 

 

 

파일이동("원본경로", "이동할경로");

 

 

// 파일 이동 시작

public static void 파일이동(String source, String target){
  String chkTemp[] = chkTmpDir(source);
  int tmpNum = chkTemp.length;
  

  for(int i = 0; i < tmpNum; i++){
    boolean chkDirTF = chkOutDir(chkTemp[i], target);
   
    if(chkDirTF){
      fileMovNew(source, target, chkTemp[i]);
    }else{
      dirFileMov(source, target, chkTemp[i]);
    }
  }
}

 

// 원본경로 추출
public static String[] chkTmpDir(String sourceD){
  File tempFolder = new File(sourceD);
  File[] TempDirAndFiles = tempFolder.listFiles();
  String dirName[] = new String[TempDirAndFiles.length];


  try{
    for (int i = 0; i < TempDirAndFiles.length; i++) {
      if (TempDirAndFiles[i].isDirectory()) {
        String tempPath = TempDirAndFiles[i].getName(); // 경로
        dirName[i] = tempPath;
      }

    }
  }catch(Exception e){
    e.printStackTrace();
  }
  return dirName; 
}
 

// 타겟 디렉터리에 원본 디렉터리와 같은 디렉토리가 있는지 확인.
public static boolean chkOutDir(String sourceD, String targetD){

  File tempFolder = new File(targetD);
  File[] TempDirAndFiles = tempFolder.listFiles();

 

  for (int i = 0; i < TempDirAndFiles.length; i++) {
    if (TempDirAndFiles[i].isDirectory()) {
      if(TempDirAndFiles[i].getName().equals(sourceD)){
        return true;
      }
    }
  }
  return false; 
}

// 파일만 이동.
public static void fileMovNew(String source, String target, String newDir){ 
  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.KOREA);
  Date date = new Date();
  String today = sdf.format(date);


  File tempFolder = new File(source + "/" + newDir);
  File outFolder = new File(target + "/" + newDir);
  
  File[] TempFiles = tempFolder.listFiles();
  File[] OutFiles = outFolder.listFiles(new FilenameFilter() {
    @Override
      public boolean accept(File dir, String name) {
        if(name.toLowerCase().endsWith("_적당한 필터명")){
          return false;
        }
        return true;
      }
    }

  );
  
  for(int i = 0; i < TempFiles.length; i++) {
    if (TempFiles[i].isFile()) {    
      for(int j = 0; j < OutFiles.length; j++){
        if (OutFiles[j].isFile()) {
          if(TempFiles[i].getName().equals(OutFiles[j].getName())){ 
            File file1 = new File(outFolder + "/" + OutFiles[j].getName());
            File file2 = new File(outFolder + "/" + OutFiles[j].getName() + "_" + today + "_적당한 필터명");
            file1.renameTo(file2);
            j = OutFiles.length;
          }
        }
      }


      File file3 = new File(tempFolder + "/" + TempFiles[i].getName());
      File file4 = new File(outFolder + "/" + TempFiles[i].getName());
      file3.renameTo(file4);
    }
  }
  delDir(tempFolder);
}
 
// 파일과 디렉터리 이동
public static void dirFileMov(String source, String target, String newDir){
  File tempFolder = new File(source + "/" + newDir);  
  File outFolder = new File(target + "/" + newDir);

  File[] TempFiles = tempFolder.listFiles();

 

  for(int i = 0; i < TempFiles.length; i++) {
    if (TempFiles[i].isFile()) {
      tempFolder.renameTo(outFolder);
    }
  }
}
 


public static void delDir(File dirName){
  dirName.delete();

}

 

 

 

다양한 기능에 범용성이 높은 메소드를 만들려고 했는데.. 시간이 없어서 되는대로 만들어졌다..

HashMap이나 ArrayList 로 만들고 루프 한번 돌 때 파일과 디렉터리를 저장하면서 처리하면, 재귀호출하지 않아도 메소드 한개에 10줄 정도면 되겠지만..(2차원 배열로도 간단하겠지?) 안해도 잘 돌아가니..

지금 Vector로 구현해야 하는 EJB 서버도 많고.. 테스트를 위한 부분이 대부분이라..

실제로 dirFileMov()만 쓰일텐데.. 귀찮다..

 

 

 

'course > 자바' 카테고리의 다른 글

연봉/퇴직금 계산  (0) 2017.03.20
객체 상속에 대한 간단한 예제..  (0) 2016.10.12
정규식 전화번호 추출하기  (0) 2016.10.12