2009년 10월 21일 수요일

C#으로 구현한 디렉토리 복사(Recursive)

public void CopyFolder(string sourceFolder, string destFolder)
{
if (!Directory.Exists(destFolder))
Directory.CreateDirectory(destFolder);

string[] files = Directory.GetFiles(sourceFolder);
string[] folders = Directory.GetDirectories(sourceFolder);

foreach (string file in files)
{
string name = Path.GetFileName(file);
string dest = Path.Combine(destFolder, name);
File.Copy(file, dest);
}

foreach (string folder in folders)
{
string name = Path.GetFileName(folder);
string dest = Path.Combine(destFolder, name);
CopyFolder(folder, dest);
}
}

WPF 3D Blogroll

http://joshsmithonwpf.wordpress.com/2008/04/10/wpf-disciples-3d-blogrollwith-audio/

http://demos.telerik.com/wpf/

2009년 10월 19일 월요일

C# 에서 파일 복사하기.


이 어플리케이션은 파일을 복사하는 기능을 가지고 있는 프로그램으로 복사하는 진행과정을 표시하기 위해서 프로그래스바(ProgressBar)컨트롤을 이용하였으며, 실제 파일이 복사되는 작업은 스레드(Thread)로 처리하여 복사작업과 진행상태작업이 동시에 이루어지도록 했습니다.

 

그리고 이프로그램은 그림에서 알 수 있듯이 두 개의 폼으로 구성되어 있습니다. 첫번째 폼(Form1)은 복사할 원본과 대상을 지정하는 폼이고, 두번째 폼(DownDialog)은 복사 진행상황을 보여주는 폼입니다. 다음 소스를 통해서 각 폼에서 처리할 일들을 알아보도록 하겠습니다.

 

/////////////////////////////////////

// Form1

/////////////////////////////////////

복사버튼을 클릭하면 발생하는 핸들러로서 DownDialog폼을 생성하여 화면에 출력하는 기능을 가진 함수입니다.

 private void btnExecute_Click(object sender, System.EventArgs e)
  {

        // 원본과 대상파일명이 있는 텍스트박스의 Text속성값을 생성자의 전달인자로 사용
        DownDialog dlg = new DownDialog(txtSrc.Text, txtDest.Text);
        dlg.Show();
  }

 

///////////////////////////////////////

// DownDialog

///////////////////////////////////////

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Threading;
using System.IO;

 

namespace Thread
{
    public class DownDialog : System.Windows.Forms.Form
    {

        // 스레드 생성과정에서 서로 다른 프로세스에 접근을 위해서 필요한 델리깃 선언
        public delegate void SetProgCallBack(int vv);  // 진행바 값을 보내기 위한 델리깃
        public delegate void SetLabelCallBack(string str);  // 진행률을 보내기 위한 델리깃
        public delegate void ExitCallBack();  // 복사완료 후 창 종료를 위한 델리깃

 

        private System.Threading.Thread t1;  // 스레드 선언
        private byte [] bts = new byte[4096];   // 파일스트림으로 주고받을 기본단위
        private FileStream fsSrc = null;   // 원본파일 스트림
        private FileStream fsDest = null;  // 대상파일 스트림

 

        public DownDialog(string src, string dest) {
            InitializeComponent();

            // 해당 파일을 파일 스트림 객체로 생성

            fsSrc = new FileStream(src, FileMode.Open, FileAccess.Read);  //읽기
            fsDest = new FileStream(dest, FileMode.Create, FileAccess.Write); //쓰기
        }


        private void DownDialog_Load(object sender, System.EventArgs e) {
            progressBar1.Maximum = 100; // 진행바의 최대값 100으로 설정

            // 스레드 생성

            t1 = new System.Threading.Thread(new ThreadStart(DownLoad));
            t1.Start();   // 스레드 시작
        }

       

        // t1 스레드에서 만들어진 값(vv)을 메인스레드(폼)의 진행바컨트롤에 지정하기 위한 메소드

        private void SetProgBar(int vv) {

            // 서로다른 프로세스에서 객체를 크로스로 접근하면 예외가 발생하므로 이를 해결하기

            // 위해서 Invoke 메소드 사용하게 된다.

            // 진행바가 현재 Invoke가 필요한 상태인지 파악하여 필요하다면 대기상태에 있다가

            // 접근가능할 때 백그라운드 작업을 진행하고, 필요한 상태가 아니라면

            // 진행바의 해당 속성에 바로 대입한다.
            if(this.progressBar1.InvokeRequired) {

                // 델리깃 생성
                SetProgCallBack dele = new SetProgCallBack(SetProgBar);

                // 대기상태에 있다가 접근가능한 상태일 때 SetProgBar 간접호출
                this.Invoke(dele, new object[] { vv });
            }
            else
                this.progressBar1.Value = vv;  
        }

       

        // t1 스레드에서 만들어진 값(str)을 메인스레드(폼)의 레이블에 지정하기 위한 메소드

        private void SetLabel(string str) {
            if(this.label2.InvokeRequired) {
                SetLabelCallBack dele = new SetLabelCallBack(SetLabel);
                this.Invoke(dele, new object[] { str });
            }
            else
                this.label2.Text = str;
        }

 

        // t1 스레드에서 메인스레드(폼)의 종료메소드(Close)를 지정하기 위한 메소드 

        private void Exit() {
            ExitCallBack dele = new ExitCallBack(Close);
            this.Invoke(dele); // 복사진행률 창 닫기
        }
       

        // 파일 복사 작업 및 진행률 구하여 값 넘기기
        private void DownLoad() {
            int vv = 1;  // 진행바의 진행률을 저장할 변수
            int cnt = 0; // 1. 반복 횟수 및 2. 파일스트림 읽거나 저장할 위치 지정 변수


            while(true) {
                if(vv >= 100) {  // 진행률이 100이 되면 무한루프 탈출
                    break;
                }

                // 원본파일 읽을 위치지정 및 4096바이트 읽어 bts에 저장
                fsSrc.Seek(4096 * cnt, SeekOrigin.Begin); fsSrc.Read(bts, 0, 4096);

                // 대상파일에 쓸 위치지정 및 bts에 저장된 값 쓰기
                fsDest.Seek(4096 * cnt, SeekOrigin.Begin); fsDest.Write(bts, 0, 4096);


                cnt++; 

 

                vv = (int)(fsDest.Length * 100 / fsSrc.Length);  // 진행률 구하기

                // 메인스레드에 값넘기기

                SetProgBar(vv);
                SetLabel(vv + "%");               
            }
            this.Exit();  // 메인스레드에 종료 알리기
        }
    }
}

2009년 10월 14일 수요일

MYSQL 기본 명령어들..

◈ mysql database 접속

-- root 유저 접속
mysql> mysql -uroot

-- mysql db 접속
mysql> use mysql;

-- database 조회
mysql> show databases;

-- table 조회
mysql> show tables;

-- table 구조 조회
mysql> desc db;



◈ root유저 비밀번호 변경

mysql> UPDATE user
SET password = password('storm')
WHERE user = 'root';
Query OK, 2 rows affected (0.28 sec)
Rows matched: 2 Changed: 2 Warnings: 0

user 테이블상에 root 사용자가 localhost와 host명으로 2개 등록 되어 있으므로
2row 의 비밀번호가 변경이 됩니다.

mysql> exit
Bye

C:mysqlbin>mysqladmin reload

-- 비밀번호를 입력해서 접속 해야 합니다.
C:mysqlbin>mysql -uroot -pstorm mysql



◈ database와 유저의 생성

-- database 생성(mysqladmin이용)
C:>mysqladmin -uroot -p create scott

-- database 생성(root유저로 접속)
C:mysqlbin>mysql -uroot -pstorm mysql

-- database 삭제
mysql> drop database scott;

-- database 생성
mysql> CREATE DATABASE scott;

-- user생성
mysql>insert into user (host,user,password) values('localhost','scott',password('tiger'));
mysql>insert into db values('localhost','scott','scott','y','y','y','y','y','y','y','y','y','y','y','y');

-- 변경사항 적용
mysql>flush privileges;

-- user삭제
mysql>DELETE FROM user WHERE user='scott' AND host='localhost';

-- 변경사항 적용
mysql>flush privileges;

-- grant문을 이용해서 사용자를 추가하는 방법
mysql>grant all on scott.* to scott@'localhost' identified by 'tiger';

-- 새로만든 scott db에 scott유저로 접속
C:mysqlbin>mysql -uscott -ptiger scott

-- script파일 실행(Oracle :start, @)
mysql>source C:scott.sql



◈ 원하는 만큼 데이터 가져오기

-- 앞에서 3개의 데이터를 조회함
mysql>SELECT empno, ename FROM emp LIMIT 3;

-- 2번째 이후의 데이터-부터 2개의 데이터를 조회함
mysql>SELECT empno, ename FROM emp LIMIT 2,2;



◈ Date And Time Functions

◈ String Functions

◈ Numeric Functions

◈ Cast Functions

◈ Other Functions

◈ Group Functions



◈ LEFT OUTER JOIN, RIGHT OUTER JOIN(Oracle : (+) )

mysql>SELECT b.deptno
FROM emp a RIGHT OUTER JOIN dept b
ON a.deptno = b.deptno



◈ SQL실행 결과를 파일로 저장

C:mysqlbin>mysql -uscott -ptiger scott > C:dump.txt
select * from emp;
select * from dept;
exit



테이블 컬럼 타입


# 날짜 및 시간 관련 컬럼 타입

- DATE
날짜를 표현하는 유형 [YYYY-MM-DD], 1000-01-01 ∼ 9999-12-31까지 나타낼 수 있

- DATETIME
날짜와 시간을 표현하는 유형 [YYYY-MM-DD HH:MM:SS], 1000-01-01 00:00:00 ∼ 9999-12-31 23:59:59

- TIMESTAMP
자동변경 컬럼 타입(4 Byte ), 1970-01-01 00:00:00부터 2037년 까지 표현

- TIME
시간을 표현하는 유형 [HH:MM:SS], 839:59:59 ∼ 833:59:59 까지 표현

- YEAR
년도를 표현하는 유형[기본적으로 4자리로 사용], 1901년 ∼ 2155년


# 문자 컬럼 타입

- CHAR(M)
고정길이 문자열 컬럼, M의 범위는 0 에서 255까지.

- VARCHAR(M)
가변길이 문자열 컬럼, M의 범위는 0 에서 255까지.

- TINYBLOB 또는 TINYTEXT
최대길이 255개의 문자를 저장

- BLOB 또는 TEXT
최대 길이가 63535인 문자를 저장

- MEDIUMBLOB 또는 MEDIUMTEXT
최대 길이가 16777215인 문자를 저장

- LONGBLOB 또는 LONGTEXT
최대 길이가 4294967295(4G)인 문자를 저장


* 참고

- BLOB(Binary Large Object의 약자
- BLOB타입은 대소문자를 구분하고 TEXT타입은 대소문자를 구분하지 않는점이 틀림
- MySQL 3.23.2이번 버전에서는 BLOB와 TEXT컬럼에는 인덱스를 만들수 없다
- BLOB와 TEXT컬럼의 저장시에 문자열 됫부분의 공백이 제거되지 않는다.
- BLOB와 TEXT컬럼은 DEFAULT를 지정할 수 없다.


# 숫자 컬럼 타입

- TINYINT
-128부터 127 까지의 정수형 타입, 부호가 없는 정수 0∼255까지 지원

- SMALLINT
-32768부터 32767 까지의 정수형 타입, 부호가 없는 정수 0∼65535까지 지원

- MEDIUMINT
-8388608부터 8388607 까지의 정수형 타입, 부호가 없는 정수 0∼16777215까지 지원

- INT 또는 INTEGER
-2147483648부터 2147483647까지의 정수형 타입, 부호 없는 정수 0∼4294967295까지 지원

- BIGINT
-9223372036854775808 부터 9223372036854775807 까지의 정수형 타입
부호 없는 정수 0∼18446744073709551615까지 지원

- FLOAT(M,D)
단정도 부동 소수점 실수, -3.402823466E+38 ∼ -1.175494351E-38
그리고 1.175494351E-38 ~ 3.402823466E+38까지 M은 숫자 전체의 길이, D는 소수점 자리수를 의미

- DOUBLE(M,D)
2 배 정밀도를 가진 부동 소수점 실수, -1.79769313486231517E+308 ∼ 2.22507385850720E+308



◈ 제약조건


# AUTO_INCREMENT(Oracle : Sequence)

-- 생성예제
mysql>CREATE TABLE sal(
sal_id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(30) NOT NULL);

- AUTO_INCREMENT로 지정된 컬럼 타입은 숫자형이어야 한다 .
- AUTO_INCREMENT는 하나의 테이블에 하나의 컬럼만 지정할 수 있음
- AUTO_INCREMENT로 지정된 컬럼은 반드시 키 또는 인덱스로 정의되어야 한다.


# NOT NULL : NULL값을 허락하지 않음

# PRIMARY KEY : 중복된 데이터를 허락하지 않음, NOT NULL 조건도 추가

# UNIQUE : 중복돈 데이터를 허락하지 않음, NULL값을 허락한다.

# DEFAULT value : 디폴트 값을 지정함


-- 예제..
mysql>CREATE TABLE emp2(
id INT(3) NOT NULL,
name VARCHAR(30) NOT NULL
sal INT(5) DEFAULT 0,
loc VARCHAR(50),
PRIMARY KEY(id, name));



◈ SELECT 문을 이용하여 테이블 생성하기

-- Syntax
mysql>CREATE TABLE new_table SELECT column_list FROM old_table WHERE condition;

-- 예제
mysql>CREATE TABLE emp3 SELECT * FROM emp WHERE deptno = 10;



◈ 테이블 변경하기(ALTER TABLE)


# 컬럼 추가
mysql>ALTER TABLE table_name ADD COLUMN column_name data_type [FIRST|AFTER column_name];


# 컬럼 삭제
mysql>ALTER TABLE table_name DROP COLUMN column_name;


# 컬럼 변경
mysql>ALTER TABLE table_name CHANGE COLUMN old_column new_column new_column_data_type;


# 테이블명 변경
mysql>ALTER TABLE old_table_name RENAME AS new_table_name;


# Primary Key 변경
mysql>ALTER TABLE table_name ADD PRIMARY KEY (column_list);

mysql>ALTER TABLE table_name DROP PRIMARY KEY;



◈ Database 백업


# mysqldump
mysqldump -uscott -ptiger scott > test.sql


# BACKUP TABLE : 테이블을 데이터 파일로 백업함
mysql>BACKUP TABLE table_name[,tbl_name] TO '/path/directory'


# RESTORE TABLE : BACKUP TABLE로 백업한 데이터를 복구한다.
mysql>RESTORE TABLE table_name[,tbl_name] FROM '/path/directory'

우분투 리눅스 터미널에서 한글이 깨질때

sudo apt-get install localepurge

설치가 완려되면 아마 바로 설정 스크립트가 실행되는데 euckr 을 꼭~ 선택한다.

(만약에 실행이 안될 경우 dpkg-reconfigure localeconf 로 실행 할 수 있다)

스크립트에서locale 설정 후 옵션 화면으로 이동하는데, 이 부분을 그냥 엔터 누르고 넘어간다.

그 다음, /var/lib/locales/supported.d/ko 파일을 열어서 "ko_KR.EUC-KR EUC-KR"를 추가한다.
(물론 따옴표 제외)

그리고 마지막으로 다음 명령어를 실행하면 완성~

locale-gen --purge
dpkg-reconfigure locales





■ 한글 환경 설정하기
 /etc/environment 파일 내에 LANG="ko_KR.UTF-8" 추가
 /etc/profile 파일 마지막에 LANG="ko_KR.UTF-8" 추가



한글 로케일 설정
(적용 안되어 있으면 일부 프로그램 한글 상태가 이상함)

일단 기본적으로 /var/lib/locales/supported.d 에 ko 가 없습니다. 따라서 언어팩 설치 후 작업 합니다.
#sudo apt-get install language-pack-ko
설치 된 완료 후
#sudo locale-gen ko_KR.EUC-KR
#sudo gedit /var/lib/locales/supported.d/ko 하단에 "ko_KR.EUC-KR EUC-KR" 추가
EUC-KR 추가
#sudo dpkg-reconfigure locales
재 설정 작업 후 시스템 재시작