레이블이 etc...인 게시물을 표시합니다. 모든 게시물 표시
레이블이 etc...인 게시물을 표시합니다. 모든 게시물 표시

2010년 5월 14일 금요일

디스크 초기화

clearhdd 1 타이핑후 y를 선택한다음 재부팅 하면 된다.

 

mbr(master boot record) 을삭제해야한다.

MBR은 파티션 위치정보를 가지고 있다.그리고 운영체제가 저장되어있는 파티션의 부트섹터를

읽어올수있는 프로그램을 포함하고 있다.

부트섹터에는 OS를 메모리에 올릴수있는 프로그램이 내장되어 있다

 

FDISK 는 파티션을 나누는 즉 디스크영역을 만드는 것이고

FDISK /mbr 은 mbr영역까지 삭제하는 명령이다.

 

실제로 Fdisk/mbr은 mbr영역중 파티션테이블 64byte를 제외한 나머지 mbr영역을 fdisk가 다시

기록해주는 것이다.

파티션테이블을 제외한 mbr영역이 손상되었을때 복구하는 도구로 사용된다.

파티션테이블 손상시에는 다른 복구유틸이나 백업본을 이용해야한다.

 

 

2010년 5월 7일 금요일

파일을 DB처럼 사용하는법

class CInfo
{
public:
char szName[40];
char szPhone[40];
char szMobile[40];
char szAddress[40];
char szEmail[40];
char szEtc[1024-40*5-7];
char szn[3];


CInfo(){
  memset(szName, 0 ,sizeof(char)*40);
  memset(szPhone, 0 ,sizeof(char)*40);
  memset(szMobile, 0 ,sizeof(char)*40);
  memset(szAddress, 0 ,sizeof(char)*40);
  memset(szEmail, 0 ,sizeof(char)*40);
  memset(szEtc, 0 ,sizeof(char)*1024-40*5-7);
  memset(szn,0,sizeof(szn));
  strncpy(szn,_T("\r\n"),sizeof("\r\n"));
}
};

1.데이터 삽입(Insert)



void CFileDB::InsertInFile(CInfo &Info)
{


m_hFile = CreateFile(_T("c:\\test001.dat"), GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

DWORD nWrite = 0;

SetFilePointer(m_hFile,0,NULL,FILE_END);

//WriteFile(m_hFile,_T("\n"),sizeof("\n"),&nWrite,NULL);




if(m_hFile != INVALID_HANDLE_VALUE)
{
  WriteFile(m_hFile,&Info,sizeof(Info),&nWrite,NULL);
}

CloseHandle(m_hFile);


}



2.데이터 조회(Select)



void CFileDB::SelectInFile(void)
{

UpdateData(TRUE);


DWORD dwStartTime, dwFinishTime;
CInfo Info;
memset(&Info,0,sizeof(Info));



m_hFile = CreateFile(_T("c:\\test001.dat"), GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

SetFilePointer(m_hFile,0,NULL,FILE_BEGIN);

int nNumOfData = GetFileSize(m_hFile,NULL)/sizeof(CInfo);

DWORD nRead = 0;

if(m_hFile != INVALID_HANDLE_VALUE)
{
  for(int i = 0 ; i< nNumOfData ; ++i)
  {
   SetFilePointer(m_hFile,sizeof(Info)*i,NULL,FILE_BEGIN);
   ReadFile(m_hFile,&Info,sizeof(Info),&nRead,NULL);

   if(m_strNameSearch.Compare(Info.szName) == 0 )
   {
    // 데이타를 표시한다.
    m_uIndex = i;
    m_strName = Info.szName;
    m_strPhone = Info.szPhone;
    m_strMobile = Info.szMobile;
    m_strAddress = Info.szAddress;
    m_strEmail = Info.szEmail;
    dwFinishTime = GetTickCount();
    m_uTime = 0;

   }
  }
 
}

CloseHandle(m_hFile);

UpdateData(FALSE);

}



3.데이터 수정(Update)



void CFileDB::UpdateInFile(void)
{

UpdateData(TRUE);


DWORD dwStartTime, dwFinishTime;
CInfo Info;
memset(&Info,0,sizeof(Info));

m_hFile = CreateFile(_T("c:\\test001.dat"), GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

SetFilePointer(m_hFile,0,NULL,FILE_BEGIN);

int nNumOfData = GetFileSize(m_hFile,NULL)/sizeof(CInfo);

DWORD nRead = 0;
DWORD nWrite = 0;

if(m_hFile != INVALID_HANDLE_VALUE)
{
  for(int i = 0 ; i< nNumOfData ; ++i)
  {
   SetFilePointer(m_hFile,sizeof(Info)*i,NULL,FILE_BEGIN);
   ReadFile(m_hFile,&Info,sizeof(Info),&nRead,NULL);

   if(m_strNameSearch.Compare(Info.szName) == 0 )
   {
    // 데이타를 표시한다.
    m_uIndex = i;
    strncpy(Info.szName,m_strName,strlen(m_strName));
    strncpy(Info.szPhone, m_strPhone,strlen(m_strPhone));
    strncpy(Info.szMobile, m_strMobile,strlen(m_strMobile));
    strncpy(Info.szAddress, m_strAddress,strlen(m_strAddress));
    strncpy(Info.szEmail, m_strEmail,strlen(m_strEmail));
    dwFinishTime = GetTickCount();
    m_uTime = 0;

    SetFilePointer(m_hFile,sizeof(Info)*i,NULL,FILE_BEGIN);
    WriteFile(m_hFile,&Info,sizeof(Info),&nWrite,NULL);

    MessageBox(_T("수정이 완료되었습니다."));

   }
  }

}

CloseHandle(m_hFile);

UpdateData(FALSE);

}



4.데이터 삭제(Delete)

void CFileDB::DeleteInFile(void)
{
CInfo Info;
DWORD nRead = 0;
DWORD nWrite = 0;

BOOL bCompare = FALSE;


m_hFile = CreateFile(_T("c:\\test001.dat"), GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
SetFilePointer(m_hFile,0,NULL,FILE_BEGIN);

int nNumOfData = GetFileSize(m_hFile,NULL)/sizeof(CInfo);

if(m_hFile != INVALID_HANDLE_VALUE)
{
  for(int i = 0 ; i< nNumOfData ; ++i)
  {
   SetFilePointer(m_hFile,sizeof(Info)*i,NULL,FILE_BEGIN);
   ReadFile(m_hFile,&Info,sizeof(Info),&nRead,NULL);

   if(m_strName.Compare(Info.szName) == 0 )
   {
    bCompare = TRUE;
   
   }

   if(bCompare)
   {
    //바로 뒤에 있는 데이터를 읽어서
    SetFilePointer(m_hFile,sizeof(Info)*(i+1),NULL,FILE_BEGIN);
    ReadFile(m_hFile,&Info,sizeof(Info),&nRead,NULL);
    //데이터를 삭제한 곳에 덮어쓴다.
    SetFilePointer(m_hFile,sizeof(Info)*i,NULL,FILE_BEGIN);
    WriteFile(m_hFile,&Info,sizeof(Info),&nWrite,NULL);  

   }


  }
}

if(bCompare)
{
  CInfo blank;
  memset(&blank,0,sizeof(CInfo));
  SetFilePointer(m_hFile,sizeof(CInfo)*(nNumOfData -1),NULL,FILE_BEGIN);
  WriteFile(m_hFile,&blank,sizeof(blank),&nWrite,NULL);

  MessageBox(_T("삭제가 완료되었습니다."));

}

CloseHandle(m_hFile);

}

2010년 4월 27일 화요일

wxWidgets 설치

1. 설치 과정 (Windows, wxWidgets 2.8.7, Code::Blocks 1.0rc2 기준)
  1. MinGW(Automated MinGW Installer) 설치: 설치 옵션에서 MinGW base tools, g++ compiler, MinGW Make 선택
  2. GDB 설치 (설치 폴더는 MinGW가 설치되어 있는 폴더로)
  3. PATH 환경변수에 MinGW의 bin 폴더 추가
    C:\MinGW\bin
    C:\MinGW\mingw32\bin
  4. wxWidgets 설치(wxMSW-Setup.exe)
  5. WXWIN 환경변수 등록(불필요하다면 생각한다면 생략)
    set WXWIN=C:\wxWidgets-2.8.7
  6. wxWidgets 빌드 (debug 버전과 release 버전을 모두 빌드할 필요가 있음)
    cd %WXWIN%\build\msw
    mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=release clean
    mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=release
    mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=debug clean
    mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=debug
    (* %WXWIN%\lib\gcc_dll 폴더에 라이브러리(.a) 파일들과 DLL 파일들이 생성된다. 이름 뒤에 'd'가 붙어 있는 것들이 debug 버전으로 빌드한 것들이다. *)
  7. wxWidgets의 include 폴더에서 setup.h 파일 생성
    cd %WXWIN%\include\wx
    ren setup_redirect.h setup.h
  8. Code::Blocks 설치(1.0rc2)
  9. 7-Zip 설치 (이미 설치되어 있다면 통과)
  10. Code::Blocks Forum에서 최신 Nightly Build를 받아 Code::Blocks 폴더에 설치: CB_20071224_rev4750_win32.7z, wxmsw28u_gcc_cb_wx287.7z
  11. Code::Blocks를 위한 기존 wxWidgets DLL 삭제: wxmsw26_gcc_cb.dll

2. Code::Blocks에서 테스트 프로그램 빌드
  1. 프로젝트 빌드 위저드('File>New>Project...')에서 'wxWidgets project'를 선택해서 새 wsWidgets 프로젝트 생성
    • wxWidgets 폴더 위치 지정 (예를 들어 'C:\wxWidgets-2.8.7')
    • 'wxWidgets Library Settings'에서 다음 옵션 선택
      • Use wxWidgets DLL
      • Enable unicode
  2. 프로젝트 빌드 옵션('Project>Build Options')의 'Linker settings'에서 링크 라이브러리 목록 수정 (다음 예는 Release 빌드의 경우이고, Debug 빌드에 대해서도 같은 방식으로 수정한다.)
    • libwxmsw28u_core.a를 libwxmsw28u.a로 수정
    • libwxbase28u.a 제거
  3. 프로젝트 빌드 ('Build>Build')
  4. 빌드한 테스트 프로그램 실행 ('Build>Run')
    (* 참고로 Code::Blocks 밖에서 실행하려면 %WXWIN%\lib\gcc_dll 폴더에 있는 wxmsw28u_gcc_custom.dll 파일을 .exe 파일과 같은 폴더에 복사하거나 C:\Windows\System32\ 폴더에 복사한다. *)

3. 참고 도서

4. 참고 URL

백업의 종류

1. 업데이트(Update) 백업
일요일 전체백업을 받은 후 월요일부터는 변경된 내용만 별도의 파일에 보관합니다.
업데이트 백업의 특징은 변경된 내용이 동일한 파일에 (예: _001.ZIA) 저장됩니다.
장점 : 저장 공간을 최소화할 수 있습니다.
단점 : 가장 최근에 백업한 날짜, 또는 전체백업 받은 날짜로만 복구가 가능합니다.
예를 들어 목요일까지 업데이트 백업을 받았다면,
월요일,화요일,수요일로는 복구가 불가능하고,
목요일 또는 일요일로 복구가 가능합니다.


2. 증가분(Incremental) 백업
일요일에 전체백업을 받은 후 월요일부터 변경된 내용은 백업을 실행할 때마다
별도의 파일(_001.ZIA, _002,ZIA, _003.ZIA ...) 에 보관됩니다.
장점 : 저장공간을 줄이면서, 백업받은 날짜별로 복구가 가능합니다.
단점 : 백업/복구할 때 모든 순차 파일이 필요합니다.
예를 들어 목요일로 복구하기 위해서는
전체백업 + 001 + 002 + 003 + 004 파일이 모두 필요합니다.
또한 모든 순차 파일을 비교하면서 백업/복구가 진행되기 때문에
순차 파일이 많아질수록 다른 백업 방법에 비해 시간이 오래 걸릴 수 있습니다.


3. 변경분(Differential) 백업
일요일에 전체백업을 받은 후 월요일부터 변경된 내용은 백업을 실행할 때마다
별도의 파일(_001.ZIA, _002,ZIA, _003.ZIA ...) 에 보관됩니다.
증가분(Incremental) 백업과의 차이점은,
변경된 내용에 대한 비교 대상이 바로 이전 백업본이 아니라
항상 "전체백업" 이라는 점입니다.
장점 : 백업받은 날짜별로 복구가 가능하며,
전체백업 + 해당 날짜 백업본 만 있으면 복구가 가능합니다.
예를 들어 목요일로 복구를 하려면,
전체백업 + 004 백업본만 있으면 복구를 할 수 있습니다.
단점 : 세가지 백업 방법 중에 저장공간을 가장 많이 차지합니다.


백업 받는 드라이브의 특징과 저장 공간에 따라서,,
세가지 백업 방법을 적절히 사용하셔야 합니다.