폴더에 있는 파일을 읽어와서 보여주는 간단한 프로그램 입니다.

웹에서 파일을 다운로드 해줘야 하는데 Batch로 파일이 계속 생성되고 있어서 목록을 수작업으로 하려니 귀찮아서 자동으로 파일 목록을 생성하도록 하기위한 기초적인 부분입니다.

 

Windows에서는 C:\\folderName으로 하면 되고 UNIX/LINUX/usr/copycoding 이런식으로 폴더명을 변경하면 됩니다.

 

현재 D:\\temp라는 folder에는 파일과 하부 폴더가 아래 그림과 같이 존재 합니다.

 

 

폴더와 파일을 불러오는 프로그램 소스는 매우 간단 합니다.

 

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
 
public class DirList {
 
        public static void main(String[] args) {
               // TODO Auto-generated method stub
                 String dirName = "D:\\temp";
              File dir = new File(dirName);
      
              File[] files2 = dir.listFiles();
              for(File f: files2){
                    String str = f.getName();
              
                    if(f.isDirectory()){
                        System.out.print(str+"\t");
                        System.out.print("DIR\n");
                    }else{
                        long ltime = f.lastModified();
                        String pattern = "yyyy-MM-dd hh:mm aa";
                               SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
                              
                               Date lastModifiedDate = new Date( ltime );
                               String frmDate = simpleDateFormat.format(lastModifiedDate);
                              
                        System.out.print(str+"/\t"+ frmDate + "/\t" +  f.length()+"bytes\n");
                      
                    }
                  
                }
 
        }
 
}

 

폴더이면 폴더명만 출력하고 파일이면 파일명과 작성일자 그리고 사이즈를 출력 합니다.

이걸 실행하면 아래와 같은 결과가 출력 됩니다.

 

backup_0808.txt/      2022-05-16 04:59 오후/ 242bytes
backup_0809.txt/      2022-05-16 04:59 오후/ 242bytes
backup_0810.txt/      2022-05-16 04:59 오후/ 242bytes
backup_0811.txt/      2022-05-16 04:59 오후/ 242bytes
backup_배치.bat/       2022-05-16 04:59 오후/ 242bytes
연습1   DIR
연습2   DIR

 

 

연습1, 연습2는 폴더인데 이것의 내부에 있는 파일명도 필요하다면 파일 목록 출력하는 부분을 method로 만들어서 호출하면 될것 같고.

Vo하나 만들어서 List<Vo>에 담아 화면에 던지면 끝이네요.

 

 

댓글에 너무 설명이 부족해서 몇자 추가합니다.

 

외부에서 호출할 URI와 Method를 생성 합니다.

@GetMapping("/fine_info")
public String fileInfo(Model model) {

}

Vo는 File과 관련된 어떤 내용을 보여줄지에 따라서 생성합니다.

class FileInfo {
      private String fileName;
      private String fileTime;

       getter/setter 추가...

}

그리고 method내에서

List<FileInfo>를 선언하고 FileInfo의 setter에 값을 하나씩 추가해 주고 화면으로 값을 넘겨 줍니다.

 

 

별로 사용할 일이 없어서 필요할때마다 사용법을 찾아야 하는 번거로움이 있어서 시간이 많이 낭비되는것 같아 한번 정리를 해 봅니다.

 

 

1. crontab 문법

 

crontab은 아래와 같은 형태로 작성을 합니다.

* * * * * python3 /home/copycoding/test.py

 

애스터리스크(*) 모양이 5개인대 처음부터 하나씩 의미하는 내용은 아래 표와 같습니다.

* * * * * xxxx.sh
(0~59) 시간(0~23) (1~31) (1~12) 요일(0~7) 실행할 명령어

 

요일이 맨 마지막에 위치하고 0:일요일, 1:월요일, 2:화요일.... 이렇게 해서 7:일요일 까지입니다.

*은 해당 항목의 조건에 모두 실행한다는 뜻입니다. (매분, 매시간, 매일, 매월, 모든요일.)

 

 

2. crontab 사용 방법

 

여기서 첫번째 분(minute) 사용방법을 알면 나머지도 동일한 패턴으로 사용 하면 됩니다.

* * * * * : 매일 매시간 매분 명령어 실행

*/10 * * * * : 매일 매시간 매10분마다(10,20,30,40,50,00) 명령어 실행

0-30/5 * * * * : 매일 매시간 0분에서 30분사이 5분마다 명령어 실행

1 * * * * : 매일 매시간 1분마다 명령어 실행

0-30 * * * * : 매일 매시간 0분부터 30분까지 매분 명령어 실행

1,5,7,9 * * * * : 매일 매시간 1, 5,7, 9분 명령어 실행

이렇게 분을 사용하듯 나머지도 유추해서 사용하면 됩니다.

 

명령어 뒤에 /dev/null을 붙여서 사용하는걸 보았을 텐데 그 의미는

* * * * * /home/copycoding/test.sh > /dev/null 2>&1

/dev/null 은 저장하지 않고 삭제한다는 의미로 로그를 남기지 않겠다는 표시고

2는 표준에러를 > 리다이렉트 해서 &1 = 표준출력 한다는 것으로

2>&1 이란 stderr 도 표준 출력 즉 /dev/null로 보내란 뜻입니다.

결론은 에러가 나도 표시하지 말고 삭제해서 안보이게 하라.

 

에러내용을 파일로 저장하려면 /dev/null 위치에 /usr/log/error.log와 같이 저장하려는 파일명을 적어주면 됩니다.

 

* * * * * /home/copycoding/test.sh > /home/copycoding/log/test.log

 

 

3. URL 실행 방법

 

crontab으로 URL을 실행하려면 curl을 사용하면 됩니다.

* * * * * /usr/bin/curl http://127.0.0.1:8080/test.do

 

만약 GET 방식으로 parameter들이 붙아야한다면 뒤에있는 param이 잘릴 수 있으니 URL을 따옴표러 묶어주면 됩니다.

* * * * * /usr/bin/curl “http://127.0.0.1:8080/test.do?id=koi8&name=copycoding”

 

 

4 crontab 편집

 

실제 crontab을 작성하고 관리하는 명령어들 입니다. 콘솔에서 명령어를 입력해서 작업하면 됩니다.

명령어 내용
crontab -e 새로 cron을 등록 하거나 기존에 작성한 내용을 수정.
vi 에디터로 전환 되며 편집을 합니다.
crontab -l 현재 작성된 crontab 내용을 보여줍니다.
아무것도 안나오면 작성을 하지 않은것 입니다.
crontab -r crontab내용을 삭제합니다.

 

 

편집 후에는 crontab을 재실행 해줍니다.

# service crond restart

crontab을 중지 하려면 다음 명령어를 사용합니다.

# service crond stop

crontab을 중지 후 사용 하려면 다음 명령어를 사용합니다.

# service crond start

 

 

실행할 명령어가 많다면 주석을 이용해 설명을 해야 하는데 이때는 맨 처음에 #을 붙여주면 됩니다.

 

# 테스트 용 주석달기 명령어1
* * * * * /명령어1
# 테스트 용 주석달기 명령어2
* * * * * /명령어2

 - copy coding -

 

JSP 파일에서 한글만 깨지는데 Server에서 받아온 데이터는 이상이 없고 유독 JSP 에서 작성한 글만 깨지는 현상이 발생 했습니다.

 

 

일반적인 방법으로 해결 방법은

 

1. JSP 페이지 상단에 다음을 입력하면 해결이 됩니다.

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

 

2. 이도 아니면 UTF-8EUC-KR로 변경하면 해결이 되기도 합니다.

 

3. 아니면 JSP 문서를 꼭 찍어서 UTF-8로 변환 합니다.

   파일에 마우스올리고 우클릭하여 properties 선택 합니다.

 

 

 

4. 그래도 안되면 Text Editor(메모장, EditPlus, UltraEditor...)에서 UTF-8로 변경해서 가지고 옵니다.

 

5. 햐! 이것도 아니면 eclipse, spring boot의 설정이 잘못되었을 수 있습니다.

   여러 설정을 알아듣지 못하는건 툴 자체의 설정에 문제가 있는것 같습니다.

 

   Window > Preferences 메뉴를 클릭 합니다.

 

 

좌측에서 General > Content Types를 클릭 하고

우측에서 Text 를 확장 합니다.

 

 

확장한 Text 에서 하단으로 내려오면 JSP가 있습니다.

여기서 하단 Default encodingUTF-8로 입력하고 JSPUTF-8로 다시 원복.

하단 [Apply and Close] 버튼을 클릭하고 다시 실행을 하면

 

한글이 잘 나옵니다.

 

또 무슨 방법이 있을까요?

 

- copy coding -

 

 

 

 

코딩을 완료하고 컴파일을 하려는데 “undefined reference to” 오류가 발생하는 경우가 있습니다.

 

/home/test/ServerComm.cpp:133: undefined reference to `ServerComm::BatchStatistics(char*, char*)'
/home/test/ServerComm.cpp:137: undefined reference to `ServerComm::~BatchStatistics()'
...
collect2: error: ld returned 1 exit status
make: *** [ServerComm.exe] 오류 1

 

이런경우 두가지만 찾아보면 쉽게 오류 해결이 가능 합니다.

 

1. Header 파일에 추가 확인

 

프로그램에 집중해서 작업을 하다 보면 function이 필요해서 추가를 하는데 막상 헤더파일에는 빼놓고 컴파일 하는 경우가 있습니다. 그런 경우에는 여기에서는 BatchStatistics.h 헤더 파일을 열고 빠진 내용을 추가하면 됩니다.

 

class BatchStatistics {
public:
    BatchStatistics(string userId, string month);
    ~BatchStatistics();

 

 

2. Makefile 추가 확인

 

만일 신규로 class 파일을 생성한 거라면 Makefile에 등록을 하지 않아 컴파일시 참조를 할 수 없어서 발생하는 오류 입니다.

 

.SUFFIXES: .o .cpp
%.o : %.cpp
           $(CC) $(CFLAGS) -c $< $(INC)
 
all: ServerComm.exe
SRV_OBJ=Main.o \
           CommServer.o \
           PostgreClass.o \
           BatchStatistics.o \
           User.o          

  

이렇게 Makefile에 추가하고 다시 make rebuild 해주면 undefined reference to 오류는 해결이 됩니다.

 

- copy coding -


1···12131415161718···118

+ Recent posts