본문 바로가기

압축파일탐색기

https://github.com/Nahrim/Finder/tree/main/finder

 

군대에 있을 때 만든 프로그램이다. 사실 프로그램이라고 하기는 좀 민망한 수준이라 습작이라고 하는 게 더 맞는 것 같다...

이동식 저장장치 내의 압축파일을 찾아내기 위해 만들었다. 사실 밖에서는 딱히 쓸모가 없는데, 거기서는 꽤 유용했다.

 

내가 근무했던 곳에서는 외부에서 들여온 저장매체(CD, 외장하드, etc)의 유해성을 클린PC로 검사했다.

클린PC는 랜선이 꽂혀있지 않고 필요한 최소한의 프로그램만 깔려있는 PC다. 여기서는 악성코드나 바이러스가 나와서 다른 PC로 퍼질 염려가 없으니 여기서 유해성을 검사한 것이다.

검사라고 해봤자 별 거 없고 백신으로 정밀 검사만 돌리면 되는 거였는데, 이 백신이 문제였다.

백신이 압축파일을 제대로 검사하지 못 한다는 것이다. 거기 있던 간부님 말씀에 따르면 그랬다.

 

처음에는 압축파일을 손으로 일일이 찾았는데, 하다 보니까 왜 이렇게 해야 되나 싶었다.

귀찮고 오래 걸리는 건 둘째치고, 사람이 하다 보니 누락이 생길 수 있다는 게 가장 큰 문제였다. 여태까지 아무도 이 부분을 조치하지 않았다는 게 놀라울 정도로..

만약에 누락이 생겼는데 그게 유해한 파일이라면 굉장히 골치아파진다. 물론 이런 경우는 거의 없지만(적어도 내가 있는 동안에는 없었다), 그렇다고 가능성이 0이라고 할 수도 없으니..

 

실제로 이걸 만들기 전에 CD에서 약 4000개의 압축파일이 나온 적이 있었다.

물론 마우스로 폴더를 뒤진 건 아니고, 확장명으로 검색한 결과다.

근데 압축파일 확장자명이 한두 개도 아니고 어느 세월에 이 짓을 하고 있나 싶어 이 프로그램을 만들었다.

필요는 발명의 어머니.

 

압축파일을 '찾아내는' 프로그램이라 'Finder'라는 이름을 붙였는데, 좀 구린 것 같다. 근데 뭐 어디다 팔 것도 아니라 그냥 대충 넘어가기로 했다.

정확히는 주어진 저장매체 내에 있는 모든 압축파일을 찾아서 한 디렉토리에 때려넣는 프로그램이다.

이름을 뭐로 해야 좋을 지 아직도 모르겠다. 이거 작년 9월에 만든 건데..

 

제일 당황스러웠던 건 당연히 라이브러리에 있을 줄 알았던 파일 복사 메소드가 없었던 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    private static final boolean reproduce(File dest, File src) {
        try {
            if(dest.exists()) {
                String idx = getNextIndexOf(dest.getName(), dest.getParentFile());
                String newDestPath = dest.getCanonicalPath();
                newDestPath = newDestPath.substring(0, newDestPath.lastIndexOf('.'));
                newDestPath = newDestPath + "_(" + idx + ")." + getExtensionOf(dest);
 
                dest = new File(newDestPath);
            } else {
                dest.createNewFile();
            }
 
            BufferedInputStream bis = new BufferedInputStream(
                                          new FileInputStream(src)
                                      );
 
            BufferedOutputStream bos = new BufferedOutputStream(
                                           new FileOutputStream(dest)
                                       );
 
            int b;
            while((b = bis.read()) != EOF) { bos.write(b);}
 
            log(src.getCanonicalPath());
            bos.flush();
            bos.close();
        } catch (IOException e) {
            dest.delete();
            return false;
        }
 
        return true;
    }
cs

이게 내가 만든 복사 메소드다. 복사를 어떻게 할까 하다가 그냥  바이트 단위로 때려넣기로 했다.

$reproduce$라는 이름은 복제라는 뜻으로 한 건데, 적절한 건지 모르겠다.

$getNextIndexOf()$ 메소드는 이름이 같은 파일을 덮어쓰지 않게 인덱스(1, 2, ...)를 매기기 위해 따로 만든 메소드다.

 

필요한 최소한의 기능은 제대로 작동하는데 뭔가 완성도가 떨어지는 듯한 느낌이 들어 아쉽다.

하지만 이제는 쓸 일이 없으니 여기까지만 하고 시간 날 때 수정해보는 걸로...

'Programming > Java' 카테고리의 다른 글

사용자 정의 예외  (0) 2019.07.07
예외 처리  (0) 2019.07.06
JVM  (0) 2019.07.04
Managed code  (0) 2019.07.04
IO 입출력  (0) 2019.05.23