C, C++2007. 5. 11. 17:54
반응형

 

출처 : codeproject.com

 

파일을 찾아 주는 클래스와 예제입니다.

STL 사용하고, 콘솔 환경 외에서 실행하시면 문제가 생길 있습니다.

(현재 디버깅 중이며, 되면 공개 하겄습니다.)

그리고, 기본 공개 클래스를 임의의로 수정한 것입니다.

(원문을 원하시면 주석의 링크로 가보세요.)

 


// win32fileiterator.h 
//////////////////////////////////////////////////////////////////////////

#ifndef __WIN32_FILE_ITERATOR_H_F3019690_E6A6_4997_AB83_E0FDDC109DE2__
#define __WIN32_FILE_ITERATOR_H_F3019690_E6A6_4997_AB83_E0FDDC109DE2__

#ifndef _WIN32
#error
32-
bit Windows required.
#endif

#include
<windows.h
>

#include <iterator
>
#include <string
>

//////////////////////////////////////////////////////////////////////////
// initial class : codeproject.com

// (http://www.codeproject.com/file/win32fileiter.asp)
// updated by j2doll
//  v0.1 (10, May, 2005) : unicode / mbcs stl support 
//                       it's tested on windows xp sp2 / visual c++ 2005 sp1  
//
//////////////////////////////////////////////////////////////////////////

class win32_file_iterator : public std::iterator<std::
input_iterator_tag,
#ifdef _UNICODE
  std
::wstring
>
#else
  std
::string
>
#endif
{

private:
  class internal_handle_data{
  public:
    internal_handle_data():_h(NULL), _ref(
0
){}
    void setHandle(HANDLE handle){ _h
=
handle; }
    HANDLE getHandle(){ return _h; }
    void incRef(){ _ref
++
; }
    unsigned decRef(){ return
--
_ref; }
    operator HANDLE(){ return _h; }
  private:
    HANDLE _h;
    unsigned _ref;
  };

public:
  win32_file_iterator(
#ifdef _UNICODE
    std
::
wstring strfilter,
#else
    std
::
string strfilter,
#endif
    bool bFullPath
=
false,
    DWORD flag
= FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL|
FILE_ATTRIBUTE_DIRECTORY):
    _bEnd(false), _bFullPath(bFullPath), _flag(flag){
        HANDLE h
= ::FindFirstFile(strfilter.c_str(), &
_wfd);
    _handle.setHandle(h);

    if(h
==
INVALID_HANDLE_VALUE){
      _bEnd
=
true;
    }else{
      _handle.incRef();
#ifdef _UNICODE
      std
::wstring::size_type n1 = strfilter.find_last_of(L"\\"
);
#else
      std
::string::size_type n1 = strfilter.find_last_of("\\"
);
#endif
      _strroot
= strfilter.substr(0,n1+1
);
      _chkvalid(_wfd);
    }
  }

  win32_file_iterator():_bEnd(true){}

  win32_file_iterator(win32_file_iterator
&
rhs){
   
    _handle
=
rhs._handle;
    _handle.incRef();

    _flag
=
rhs._flag;
    _bFullPath
=
rhs._bFullPath;
    _bEnd
=
rhs._bEnd;
    _wfd
=
rhs._wfd;
    _strfname
=
rhs._strfname;
    _strroot
=
rhs._strroot;   
  }

  ~win32_file_iterator(){
    if(_handle.decRef()
== 0 && _handle.getHandle() !=
NULL ){
      FindClose(_handle);
    }
  }

  reference operator
*
(){
    return _strfname;
  }

  bool operator
==(const win32_file_iterator&
rhs) const{
    return (_bEnd
==
rhs._bEnd);
  }
  bool operator
!=(const win32_file_iterator&
rhs) const{
    return (_bEnd
!=
rhs._bEnd);
  }

 
//Prefix
  win32_file_iterator& operator++
(){
    _findnext();
    return
*
this;
  }
 
//Posfix
  win32_file_iterator& operator++
(int){
    _findnext();
    return
*
this;
  }

private:
  void _findnext(){
    BOOL b
= ::FindNextFile(_handle, &
_wfd);
    if(b){
      _chkvalid(_wfd);
    }else{
      _bEnd
=
true;
    }
  }

  void _chkvalid(WIN32_FIND_DATA
&
_wfd){
    if(_wfd.dwFileAttributes
&
_flag){
      _getval(_wfd);
    }
    else{
      _findnext();
    }
  }
  void _getval(WIN32_FIND_DATA
&
wfd){
    if(_bFullPath)
      _strfname
= _strroot+
wfd.cFileName;
    else
      _strfname
=
wfd.cFileName;
  }

private:
  DWORD _flag;
  bool _bFullPath;
  bool _bEnd;
  internal_handle_data _handle;
  WIN32_FIND_DATA _wfd;
#ifdef _UNICODE
  std
::
wstring _strroot;
  std
::
wstring _strfname;
#else
  std
::
string _strroot;
  std
::
string _strfname;
#endif

};

#endif

 

 

// test function

void test1()
{


#ifdef _UNICODE

  std
::wstring pathstr = L"C:\\*.*";
 
// DWORD fileopt = FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL; 
  DWORD fileopt = FILE_ATTRIBUTE_DIRECTORY; 
// only directory 
  win32_file_iterator itBegin(pathstr, false, fileopt), itEnd;
  std
::vector<std::wstring>
vec(itBegin, itEnd);

  std
::
wstring strtemp;
  std
::vector<std::wstring>::
size_type i;
  for ( i
= 0 ; i < vec.size(); i ++
)
  {
    strtemp
=
vec.at( i );

    wprintf( L
"%s\r\n"
, strtemp.c_str() );
  }

#else

  std
::string pathstr = "C:\\*.*"
;
  
// DWORD fileopt = FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL;
  DWORD fileopt = FILE_ATTRIBUTE_DIRECTORY;
// only directory 
  win32_file_iterator itBegin(pathstr, false, fileopt), itEnd; 
  std
::vector<std::string>
vec(itBegin, itEnd);

  std
::
string strtemp;
  std
::vector<std::string>::
size_type i;
  for ( i
= 0 ; i < vec.size(); i ++
)
  {
    strtemp
=
vec.at( i );

    printf(
"[DIR]%s\r\n"
, strtemp.c_str() ); 
  }

#endif
}
 

 

 

http://j2doll.tistory.com/105
 
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

반응형

'C, C++' 카테고리의 다른 글

상수 포인터...  (0) 2007.05.17
최대한 잘라먹기(Maximal Munch)와 컴파일러(Compiler)  (2) 2007.05.16
TTOF2() 함수  (0) 2007.05.09
VC+6 아직도 쓴다면...  (0) 2007.05.08
CMainFrame IDR_MAINFRAME 확장자 연결 문자열  (0) 2007.04.26
Posted by Jay Two
C, C++2007. 5. 9. 14:11
반응형
반응형
Posted by Jay Two
C, C++2007. 5. 8. 12:05
반응형

좀 연세가 있으신(?) 코더 분들중에는
아직도 Visual C++ 6.0 을 아직도 사용하시는 분들도 있다.
이런 분들을 위한 어드바이스...

1) 서비스 팩을 반드시 받아서 설치하라.
   마지막 버전은 서비스 팩 6 이며, 사용 국가 언어에 맞추어 설치하라.
   (여기서, MFC42.DLL 은 과연 몇 가지나 될까하는 의문도 생기는데,
    결론부터 이야기하자면 천개가 넘는다!!!! DA책 참조...
    이점은 배포시에도 주의하도록 해야 한다...)
   그리고,  프로세스 팩을 설치한다면 반드시 영문(English)에다가
   서비스팩 5 를 설치해야 할 것이다.

2) 플랫폼 SDK 를 활용하라.
    이거 안 쓰는 분들 많은데, 꼭 써야 기능과 호환성 문제를 가능한한 극복할 수 있다.
    참고로 VC+6 용 플랫폼 SDK 는 현재 최근 버전에서는 지원이 종료되었다.
    2003년 2월 버전까지만 지원이 되므로, 그걸로 하도록 하자.

3) WIN64 는 당연히 안 된다.
    어쩌겠는가... 미리 준비하지 않은 당신...떠나라~...어디로 가?!?!

4) 유니코드 지원은 최소한 미리 해두자.
    VC+2005 부터는 유니코드가 디폴트 설정이다. (왜? WIN98은 공식 지원이 끝난 OS 이므로
    MS 에서는 더 지원해줄 필요가 없기 때문이다...비스타까지 나왔는데...왜 허겄는가...)
    거기에다가, XP, 비스타 등의 OS 가 기본인 대세에서 유니코드 지원은 피할 수 없다!!!
    (미리 포팅하지 않고 중간에 할려면 입에서 단내가 날것이다...ㅋㅋ)

5) VC2005에서는 Secure 관련이 강화되었다.
    (이것도 중간 코드를 이식하려면 귀찮고도 짜증나는 일이 될 것이다.
     전처리기로 막을 수도 있지만, MS 비권장 사항은 절대로 하지 않는 것이 좋다!!!)
    이제 strcpy() 등의 함수는 더 이상 안 키운다...

6) 6 타입 위자드도 못 쓴다.
    6 까지는 VC위자드가 바이너리이지만, 그후는 XML 기반이다.
    다 뜯어 고치던가...접어라....

7) 매니페스트 처리도 추가하라

8) 6 에서 비스타 관련 지원...
   당연히 안 된다!!! 특히 보안 필요한 까탈한 API 호출 시는 GG 쳐라...

9) 결론은 빨리 접어라...
    위의 방법들은 어쩔 수 없는 경우의 땜빵 처리들이며, 근원적인  문제 해결은 안 된다.
    하지만, 팀원들 중 노땅(?)이나 게으른 이들은 포팅을 거부하기도 할 것이다.
    그럴 경우, 최종 지원 플랫폼은 윈 98 이나 2000 으로 하던가...말던가...쩝...  
    그리고, 가능하면 2003 도 빨리 2005 로 포팅하기를 권한다...
    여러분의 사장님은 포팅을 위한 별도의 공수(man-hour)를 할당해 주지는 않을 것이다...

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

반응형

'C, C++' 카테고리의 다른 글

클래스 win32_file_iterator  (0) 2007.05.11
TTOF2() 함수  (0) 2007.05.09
CMainFrame IDR_MAINFRAME 확장자 연결 문자열  (0) 2007.04.26
GetProcAddress 과 Unicode  (0) 2007.04.14
.NET 프레임워크 인식하기  (0) 2007.04.07
Posted by Jay Two
C, C++2007. 4. 26. 11:13
반응형

CMainFrame IDR_MAINFRAME 확장자 연결 문자열

출처 : MSDN 예제>

확장자 myc 를 프호그램에 연결하고 싶은 경우,
resource editor 에서 다음처럼 편집해 본다!!

 IDR_MAINFRAME


 MyCalc Windows Application\nSheet\nWorksheet\n Worksheets (*.myc)\n.myc\nMyCalcSheet\n MyCalc Worksheet

 

반응형

'C, C++' 카테고리의 다른 글

TTOF2() 함수  (0) 2007.05.09
VC+6 아직도 쓴다면...  (0) 2007.05.08
GetProcAddress 과 Unicode  (0) 2007.04.14
.NET 프레임워크 인식하기  (0) 2007.04.07
SAFEARRAY 생성 / 소거 API 예제  (1) 2007.04.03
Posted by Jay Two
HTML XML2007. 4. 25. 11:56
반응형
사용자 삽입 이미지

http://support.microsoft.com/kb/269238/ko


MSXML 은 IE 에서 사용하는 WININET 과 더불어 매우 중요한 라이브러리 중 하나이다.
물론, 기능은 이름에서 알 수 있듯이 XML 의 파싱과 구성이 주된 기능이다.
그런데, 요넘은 IE 와 OS 등의 버전과 함께 맞물려 올라가기 때문에
사용 전에 자신이 사용하는 MSXML 의 버전을 미리 체크한 후에
사용해야 한다.

현재 MSXML 6 까지 공식 지원이 보이고 있는데, 향후 이것이 다른 것으로
통합될지 어떨지는 사실 알 수 없다. (M$ 맘이므로...)
그래서 향후에도 사용할 안정적인 XML 라이브러리를 찾는다면
오픈 소스 계열 것을 사용하는 것도 좋은 방법 중 하나일 것이다.
하지만, 우리는 코더!!!! 미래의 일은 그때 생각하자^_^!!! (미래는 甲의 것, 乙이하는 알봐아니다...)
현실에서 사용하기 편한 요넘을 마구마구 써주도록 한다.
그리고, 지원이 끊어져도 사용할 수 없다는 이야기는 아니다.
dshow 처럼 사용은 가능하지만 향후 버전업을 기대하지 말라는 것이므로...

또한 MSXML 은 높은 버전의 것이 낮은 버전 것보다 압도적으로
사용하기 편한 인터페이스를 가지고 있다.
현실적으로 M$에서 지원하는 최소 OS 는 2000 이므로,
거기에 맞추어 개발하는 것도 正道일 것이다..(98은 고만좀해...)
그러나 98 에도 IE6 이상을 설치 하거나 MDAC 상위 버전 설치등을 하면
어느 정도 높은 버전의 MSXML 을 사용할 수 도 있다.

반응형

'HTML XML' 카테고리의 다른 글

XML 예약 문자  (0) 2007.08.17
XHTML 과 HTML 사이의 차이점  (0) 2007.06.09
Microsoft XML Notepad 2007  (0) 2007.04.24
Posted by Jay Two
HTML XML2007. 4. 24. 21:05
반응형

사용자 삽입 이미지
첨부파일
다운로드

출처 :

Microsoft

...XML 편집기의 무료/상용 소프트웨어는 엄청나게 많습니다.
...머...사실 메모장 하나만 달랑 있어도, 시력만 좋다면(?) 누구나 편집 가능하기도 합니다.
...요건 그중 MS 에서 무료로 배포하는 XML 편집기입니다.
...아주 작고 간단합니다.(중요!)
...뛰어난 자동화 기능은 없지만, 간략하게 XML 을 보고, 편집할 수 있습니다.
...관련 프로그램 코더들에게 테스트용으로도 요긴할 것같습니다.
...(물론 VS 가 워낙 좋으니까 비교해서 쓸지는 모르겠지만...)

사용자 삽입 이미지

Creative Commons License

이 저작물은

크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스

에 따라 이용하실 수 있습니다.

반응형

'HTML XML' 카테고리의 다른 글

XML 예약 문자  (0) 2007.08.17
XHTML 과 HTML 사이의 차이점  (0) 2007.06.09
MSXML 버전...  (0) 2007.04.25
Posted by Jay Two
C, C++2007. 4. 14. 20:23
반응형
반응형

'C, C++' 카테고리의 다른 글

VC+6 아직도 쓴다면...  (0) 2007.05.08
CMainFrame IDR_MAINFRAME 확장자 연결 문자열  (0) 2007.04.26
.NET 프레임워크 인식하기  (0) 2007.04.07
SAFEARRAY 생성 / 소거 API 예제  (1) 2007.04.03
CComSafeArray 클래스  (0) 2007.04.03
Posted by Jay Two
Algorithm2007. 4. 11. 17:27
반응형
반응형
Posted by Jay Two