(WinAPI) 디렉터리 제어 응용

IT/Programming/WinAPI 2014. 4. 21. 15:13

 

출처 : http://blog.daum.net/studiocoma/6521408

 

Win32 API가 제공하는 CreateDirectory 함수의 응용.

API CreateDirectory의 경우 c:\1\2\3을 만들때 c:\1\2가 이미 존재하지 않으면 실패한다. -_-

이를 보완하고(상위폴더부터 주구장창 만들어 낸다;) 경로에 파일명까지 포함되어 있어도 폴더만 만들도록 해봤다.
- 말은 거창(?)한데 그냥 문자열 파싱해서 CreateDirectory를 반복 호출한다;; 

BOOL _CreateDirectory( LPCTSTR lpszPath )
{
    TCHAR szPathBuffer[MAX_PATH];

    size_t len = _tcslen( lpszPath );

    for ( size_t i = 0 ; i < len ; i++ )
    {
        szPathBuffer[i] = *( lpszPath + i );
        if ( szPathBuffer[i] == _T('\\') || szPathBuffer[i] == _T('/') )
        {
            szPathBuffer[i + 1] = NULL;
            if ( ! PathFileExists( szPathBuffer ) )
            {
                if ( ! ::CreateDirectory( szPathBuffer, NULL ) )
                {
                    if ( GetLastError() != ERROR_ALREADY_EXISTS )
                        return FALSE;
                }
            }
        }
    }
    return TRUE;
}


-----------------------------------------------------------------------------------------


CFileFind fileFinder;
 if(!fileFinder.FindFile(".\\simple\\MyMenu.mdb"))
 {
  CreateDirectory(".\\simple", NULL);
  CopyFile(".\\MyMenu.mdb", ".\\simple\\MyMenu.mdb", TRUE);
 }



부모디렉토리없어도 디렉토리 생성하기, 디렉토리에 파일있어도 하위디렉토리까지 모든파일 삭제하기


출처 :  http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=7293&ref=7293

 

 

#include <windows.h>

#include <stdio.h>

#include <string>

 

using namespace std;

 

/*

 

  기존 디렉토리가 있을경우 안만들어지고 없으면 만든다. 부모디렉토리가 없어도 생성가능

 

*/

void CreateDir(char* Path)

{

    char DirName[256];  //생성할 디렉초리 이름

    char* p = Path;     //인자로 받은 디렉토리

    char* q = DirName;  

 

    while(*p)

    {

        if (('\\' == *p) || ('/' == *p))   //루트디렉토리 혹은 Sub디렉토리

        {

            if (':' != *(p-1))

            {

                CreateDirectory(DirName, NULL);

            }

        }

        *q++ = *p++;

        *q = '\0';

    }

    CreateDirectory(DirName, NULL);  

}

 

 

/*

 

 하위디렉토리를 제외한 해당 디렉토리 모든 파일들을 제거

 

 */

void DeleteAllFiles(char* folderPath)

{

    char fileFound[256];

    WIN32_FIND_DATA info;

    HANDLE hp;

 

    sprintf(fileFound, "%s\\*.*", folderPath);

    hp = FindFirstFile(fileFound, &info); //디렉토리에 파일이 있는지 첫번째 파일만.

    do

    {

        sprintf(fileFound,"%s\\%s", folderPath, info.cFileName);

        DeleteFile(fileFound);

 

    }while(FindNextFile(hp, &info));  //다른 파일이 있을때 까지

 

    FindClose(hp);

}

 

 

/*

 

 해당 하는 디렉토리에 파일이 존재해도  디렉토리가 비어있지 않아도 지울수 있다 .

 

*/

 

void EmptyDirectory(char* folderPath)

{

    char fileFound[256];

    WIN32_FIND_DATA info;

    HANDLE hp;

 

    sprintf(fileFound, "%s\\*.*", folderPath);

    hp = FindFirstFile(fileFound, &info);   //디렉토리에 파일이 있는지 첫번째 파일만.

    do

    {

        if (!((strcmp(info.cFileName, ".")==0)||(strcmp(info.cFileName, "..")==0)))

        {

            if((info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)==FILE_ATTRIBUTE_DIRECTORY)  //Sub디렉토리가 존재하는경우

            {

                string subFolder = folderPath;

                subFolder.append("\\");

                subFolder.append(info.cFileName);

                EmptyDirectory((char*)subFolder.c_str()); /// {return (_Ptr == 0 ? _Nullstr() : _Ptr); }

                RemoveDirectory(subFolder.c_str());

            }

            else

            {

                sprintf(fileFound,"%s\\%s", folderPath, info.cFileName);

                BOOL retVal = DeleteFile(fileFound);

            }

        }

 

    }while(FindNextFile(hp, &info));

 

    FindClose(hp);

}


 

-----------------------------------------------------------------------------------------


CreateDirectory 에서 폴더 접근 권한 바꾸기


출처 : http://ktr0.egloos.com/757379


Windows API 를 보면 CreateDirectory 라는 함수가 있다.

CreateDirectory("c:\aaa",NULL);

위와 같은 방법으로 첫번째 파라메터에 폴더 이름을 써 주고
두번째 파라메터에 NULL 을 써 주는 경우가 많다.

두 번째 파라메터는 사실 보안에 대한 파라메터이다.

PSECURITY_ATTRIBUTE 형의 변수가 들어가는데, NULL 이면 부모 폴더의
값을 그대로 가져온다.

 SECURITY_ATTRIBUTES sa;
 SECURITY_DESCRIPTOR sd;
 PSID pEveryoneSID = NULL;
 SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
 EXPLICIT_ACCESS ea[2];
 PACL pacl = NULL;
 if(!AllocateAndInitializeSid(&SIDAuthWorld,1, SECURITY_WORLD_RID,0,0,0,0,0,0,0,&pEveryoneSID))
 {
  AfxMessageBox("Fail to get Everyone SID!!!",0,0);
  return;
 }
 ZeroMemory(&ea, 2*sizeof(EXPLICIT_ACCESS));
 ea[0].grfAccessPermissions = GENERIC_ALL;
 ea[0].grfAccessMode = SET_ACCESS;
 ea[0].grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT;
 ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
 ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
 ea[0].Trustee.ptstrName = (LPTSTR) pEveryoneSID;

 SetEntriesInAcl(1,ea, NULL, &pacl);
 InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
 SetSecurityDescriptorDacl(&sd, TRUE,pacl , FALSE);
 //SetSecurityDescriptorSacl(&sd, TRUE,pacl , FALSE);


 sa.nLength = sizeof (SECURITY_ATTRIBUTES);
 sa.lpSecurityDescriptor = &sd;
 sa.bInheritHandle = TRUE;
 
 ::CreateDirectory(sysDirBuffer_tmp,&sa);
 if(pEveryoneSID){
  FreeSid(pEveryoneSID);
 }
 if(pacl){
  LocalFree(pacl);
 }

위의 예가 바로 CreateDirectory 함수에서 SECURITY_ATTRIBUTE 값을 가지고
폴더에 모든 ACCESS 권한을 주는 예제이다.

 

http://www.tipssoft.com/bulletin/board.php?bo_table=QnA&wr_id=380&page=392

GetCurrentDirectory 함수 : 현재의 작업 디렉토리를 얻어온다. 
SetCurrentDirectory 함수 : 작업디렉토리의 경로를 셋팅한다. 

일반적으로 작업디렉토리는 파일이 실행된 경로가 지정됩니다. 
아래는 작업디렉토리의 변경이 일어나는 대표적인 예인 CFileDialog 대화상자를 이용한 경우입니다 

참고하시면 될 듯 싶습니다. 


    char path[MAX_PATH] = {0}; 
    // 현재의 작업디렉토리를 저장한다. 
    GetCurrentDirectory(MAX_PATH, path); 

    // CFileDialog 를 Open 모드로 생성한다. 
    CFileDialog dlg(TRUE); 
    if(dlg.DoModal()==IDOK){ 
                // 사용자가 폴더를 옮겨가며 특정 파일을 지정 
                // 이경우 작업폴더가 변경됨. 
                CString str = dlg.GetFileName(); 
                //얻어온 파일과 관련된 코드 추가.............. 
                
                // 이전에 저장했던 작업디렉토리 경로를 되돌려 셋팅 
                SetCurrentDirectory(path); 
    }

 

 

=============================================

 

Directory 컨트롤에 관하여 좋은 응용 예제를 모아놓은 블로그(http://blog.naver.com/dolicom/10096040743)에서 관련된 내용을 퍼왔다.

 

위의 응용 예제도 나쁘지 않지만, CreateDirectory 를 사용하여 디렉터리 트리를 구성할 때에는 CreateDirectory() 보다는 SHCreateDirectory / SHCreateDirectoryEx() 를 사용하는 것이 훨씬 편하다.

 

 SHCreateDirectoryEx(NULL, "C:\\a\\b\\", NULL);

 

이런식으로만 하면 a 폴더가 없더라도 a\b 폴더 둘 다 만들어지기 때문이다. 해당 함수를 쓰기 위해서는 Shlobj.h 를 포함시켜야 한다.

 

SHCreateDirectoryEx : http://msdn.microsoft.com/en-us/library/windows/desktop/bb762131(v=vs.85).aspx

 

SHSHFileOperation function : http://msdn.microsoft.com/en-us/library/windows/desktop/bb762164(v=vs.85).aspx

 

설정

트랙백

댓글

(WinAPI/MFC) GUI 프로그래밍을 하면서 콘솔을 임의로 띄워 테스트하기

IT/Programming/WinAPI 2013. 10. 17. 18:41

콘솔 환경에서는 값을 찍어보며 확인하기 위해서 printf() 를 주로 사용하게 된다. 하지만 GUI 프로그래밍의 경우에는 콘솔이 존재하지 않아 printf() 로 값을 확인할 수 없기 때문에 Output 창을 사용하거나 MessageBox 등을 이용하는 경우가 많은데, 아래의 코드처럼 별도로 subsystem을 console로 지정해주면 GUI창과 콘솔 창 모두 확인할 수 있다. 


#ifdef _DEBUG // 디버그 모드일 경우

#ifdef UNICODE // 유니코드일 경우

#pragma comment(linker, "/entry:wWinMainCRTStartup /subsystem:console")

#else // 멀티바이트일 경우

#pragma comment(linker, "/entry:WinMainCRTStartup /subsystem:console")

#endif

#endif



설정

트랙백

댓글

(WinAPI) editbox 에 줄바꿈 삽입이 안될 때

IT/Programming/WinAPI 2013. 10. 16. 19:50


editbox 컨트롤에 줄바꿈(엔터키, 개행문자)을 넣을 때 "\r\n" 을 삽입해도 강제개행이 되지 않는 경우가 있다.


예를 들어 다음과 같은 코드를 삽입했을 때 우리는 editbox 컨트롤에 다음과 같이 개행이 되어 있는 상태로 글이 삽입되기를 기대하게 된다.


SetWindowText(hEdit, TEXT("AAAA\r\nBBBB\r\n");

 

AAAA

BBBB

하지만 이렇게 되지 않고 AAAABBBB 와 같이 개행문자가 무시되는 경우가 있는데, 이 경우 해당 에디트 박스의 스타일 중 Multiline 스타일을 True로 설정이 되어 있는지를 확인해야한다. 이 스타일이 적용되어 있지 않다면 개행이 되지 않는다.



설정

트랙백

댓글

TreeView CommonController 사용시 주의할 점

IT/Programming/WinAPI 2013. 9. 6. 12:57

1. TreeView_DeleteItem() 을 사용시, TreeView_DeleteItem(hTree, NULL); 처럼 HTREEITEM 인자에 NULL 값을 주면 전체 노드가 삭제된다. 이게 왜 주의할 점이냐면, TreeView_DeleteItem(hTree,TreeView_GetChild(hTree, Node)); 처럼 사용할 경우, Node의 자식 노드가 존재하지 않을 경우 TreeView_GetChild() 가 NULL을 리턴한다. 즉, 의도하지 않게 전체 노드가 삭제될 수 있다는 이야기다.

 

삭제를 위한 반복문에서 이 경우를 신경쓰지 않고 코딩을 하면 이런 버그를 만날 수 있다.

 

물론 이를 방지하기 위해서는 다음과 같이 자식 노드가 존재하는지를 미리 체크해주는 루틴을 넣어주면 된다.

 

if( NULL != TreeView_GetChild(hTree, Node)) {
    TreeView_DeleteItem(hTree, TreeView_GetChild(hTree,Node));
}

 

 

2. TreeView_GetItem() 을 사용하여 노드의 텍스트를 가져올 때, cchTextMax도 설정해주어야 한다.

ex)

  TVITEM tvi;

  char buf[25];

tvi.hItem = Node;

tvi.mask = TVIF_TEXT;

tvi.cchTextmax = 20;

tvi.pszText = buf;

TreeView_GetItem(hTree, &tvi);

 

3. 어지간하면 TreeView_Expand() 는 맨 마지막에.

TreeView에 데이터를 넣다 보면 여기 저기 갖가지 부모 노드에 자식 노드를 넣어야 하는 경우가 있다. 이럴 경우 노드 처리 작업을 모두 진행한 후에 TreeView_Expand() 를 해줘야지 해당 노드가 제대로 펼쳐진다. 즉, 미리 TreeView_Expand() 명령을 때려놓고 노드 삽입/삭제 작업을 진행하면 Expand가 풀려버리게 된다는 말이다.

설정

트랙백

댓글

(WinAPI) 파일/폴더 경로 조작과 관련된 유용한 함수 리스트

IT/Programming/WinAPI 2013. 7. 10. 23:01
윈도우의 Visual C++에서 파일 경로를 조작할 때 사용할 수 있는 유용한 API 함수들이다.
사용하기 위해 아래와 같이 선언한다.
#include <shlwapi.h> #pragma comment(lib, "shlwapi")

 

해당 API에 MSDN 링크가 붙어있으니 클릭하면 더 자세한 정보를 얻을 수 있다. 



PathAddBackslash - 경로에 백슬레시를 덧붙여준다. 백슬레시가 이미 붙어 있으면 변경하지 않는다.
"c:\abc" -> "c:\abc\"
"c:\abc\" -> "c:\abc\"

PathAddExtension - 파일 경로 뒤에 지정된 확장자를 덧붙여준다. 확장자가 이미 있다면 변경하지 않는다.
"c:\abc", ".bak" -> "c:\abc.bak"
"c:\abc.cpp", ".tmp" -> "c:\abc.cpp"

PathAppend - 두 개의 경로를 덧붙인다. 사이에 백슬레시가 없으면 자동으로 추가해 준다.
"c:\abc", "def" -> "c:\abc\def"
"c:\abc\", "def" -> "c:\abc\def"
"c:\abc", "\def" -> "c:\abc\def"
"c:\abc\", "\def" -> "c:\abc\def"

PathBuildRoot - 드라이브 식별번호를 드라이브 경로로 변경해 준다.
0 -> "A:\"
1 -> "B:\"
2 -> "C:\"

PathCanonicalize - 특별한 경로 문자열을 정리해 준다.
"c:\abc\def\..\ghi" -> "c:\abc\ghi"
"c:\abc\def\.\ghi" -> "c:\abc\def\ghi"

PathCombine - 두 개의 경로를 결합한다. 백슬레시도 검사해서 추가하고 ., ..과 같은 특별한 경로 문자열도 정리해 준다.
"c:\abc", "def.txt" -> "c:\abc\def.txt"
"c:\abc\", "..\def\ghi.txt" -> "c:\def\ghi.txt"

PathCommonPrefix -  공통된 경로를 골라낸다.
"c:\abc\def.txt", "c:\abc\ghi\" -> "c:\abc"
"c:\abc\def\jkl.txt", "c:\abc\def\..\jkl.txt" -> "c:\abc\def"

PathCompactPath -  경로를 dc와 pixel 폭 크기에 알맞게 적당히 줄여준다.
hDC, "c:\abc\def\ghi\jkl.txt", 100 -> "c:\abc\...\jkl.txt"

PathCompactPathEx - 경로를 최대 문자열 길이에 알맞게 적당히 줄여준다.
"c:\\abc\\def\\jkl.txt", 15 -> "c:\...\jkl.txt"

PathCreateFromUrl - URL로 쓰여진 파일명을 경로로 변환한다.
"file:///c:/abc/def.txt" -> "c:\abc\def.txt"

PathFileExists - 해당 경로나 파일이 실제로 존재하는지 검사한다.

PathFindExtension - 확장자의 위치를 찾아서 반환한다.
"c:\abc\def.txt" -> ".txt"

PathFindFileName - 파일 이름의 위치를 찾아서 반환한다.
"c:\abc\def.txt -> "def.txt"

PathFindNextComponent - 전체 경로 중 한 단계씩 하위로 내려간 경로를 반환한다.
"c:\abc\def.txt" -> "abc\def.txt"
"abc\def.txt" -> "def.txt"
"def.txt" -> ""

PathFindOnPath - 파일을 찾아서 완전한 경로를 반환한다. (목록이 NULL일 경우 실행 PATH에서 찾기)
"cmd.exe", NULL -> "C:\WINDOWS\system32\cmd.exe"
"iexplore.exe", { "c:\Windows", "c:\Program Files", "c:\Program Files\Internet Explorer", NULL } -> "c:\Program Files\Internet Explorer\iexplore.exe"
파일이 여러개라면 첫번째로 발견된 파일의 경로만 반환

PathFindSuffixArray - 지정된 접미사 목록에서 입력된 경로에 일치하는 것을 찾는다. (대소문자 구분)
"c:\abc\DEF.txt", { "def.txt", "DEF.txt", ".txt" }, 3 -> "DEF.txt"
"c:\abc\def\ghi.txt", { "def.txt", "DEF.txt", ".txt" }, 3 -> ".txt"

PathGetArgs - 전체 문자열에서 앞 단어를 무시한 입력 인자 위치를 찾아서 반환한다.
"test.exe temp.txt sample.doc" -> "temp.txt sample.doc"
"test.exe sample All 15" -> "sample All 15"
"test.exe" -> ""
"abc def ghi" -> "def ghi"

PathGetCharType - 문자가 경로에서 어떤 목적으로 쓰일 수 있는지 확인한다.
':' -> GCT_SEPARATOR
'.' -> GCT_LFNCHAR | GCT_SHORTCHAR
'\\' -> GCT_SEPARATOR
'/' -> GCT_INVALID
'\"' -> GCT_INVALID
'\'' -> GCT_LFNCHAR | GCT_SHORTCHAR
'\t' -> GCT_INVALID
'\n' -> GCT_INVALID
',' -> GCT_LFNCHAR
'*' -> GCT_WILD
'?' -> GCT_WILD
입력된 문자열을 검색하면서 리턴값을 조사하면 올바른 경로인지 미리 검사할 수 있다.

PathGetDriveNumber - 경로가 어느 드라이브에 있는지 번호를 확인한다.
"c:\abc\def.txt" -> 2
"d:" -> 3
"s:\test" -> 18

PathIsContentType - 파일 확장자가 콘텐츠 형식과 일치하는지 확인한다.
"c:\abc\def.txt", "text/plain" -> TRUE
".txt", "text/plain" -> TRUE
"txt", "text/plain" -> FALSE

PathIsDirectory - 실제로 존재하는 폴더인지 확인한다.
"c:\windows" -> TRUE
"c:\abc" -> FALSE

PathIsDirectoryEmpty - 폴더 내부가 비어있는지 확인한다.
"c:\windows" -> FALSE

PathIsFileSpec - 주어진 경로에 경로 문자들이 없는지 확인한다. 결과가 참이라도 올바른 파일명이 아닐 수 있다.
"c:\abc\def.txt" -> FALSE
"test.txt" -> TRUE
"*-wow." -> TRUE

PathIsHTMLFile - 콘텐츠 형식이 "text/html"인 확장자인지 확인한다.
"test.html" -> TRUE
"test.htm" -> TRUE
"test.xml" -> FALSE
"test.txt" -> FALSE

PathIsLFNFileSpec - 주어진 경로가 긴파일이름에 적합한지 확인한다.

PathIsNetworkPath - 주어진 경로가 네트워크 경로 형식인지 확인한다. (실제로 존재하는지 확인하지는 않음)
"c:\abc\def.txt" -> FALSE
"\\abc\def.txt" -> TRUE
"http://abc/def.txt" -> FALSE

PathIsPrefix - 경로가 주어진 위치에서 시작하는지 확인한다.
"c:\", "c:\abc" -> TRUE
"C:\", "c:\abc" -> TRUE
"c:", "c:\abc" -> FALSE
"..\abc", "..\abc\def" -> TRUE
"d:\abc", "d:\def" -> FALSE

PathIsRelative - 주어진 경로가 상대 경로인지 확인한다. (파일명만 있어도 상대 경로로 인정)
".\abc.txt" -> TRUE
"..\abc\def.txt" -> TRUE
"c:\abc\def.txt" -> FALSE
"c:\abc\..\def.txt" -> FALSE
"test.txt" -> TRUE

PathIsRoot - 주어진 경로가 드라이브 루트인지 검사한다.
"c:\" -> TRUE
"c:" -> FALSE
"c:\test.txt" -> FALSE

PathIsSameRoot - 주어진 경로가 같은 드라이브에 있는지 검사한다.
"c:\abc\def", "c:\test.txt" -> TRUE

PathIsSystemFolder - 시스템 속성을 가진 폴더인지 확인한다.
"c:\windows" -> FALSE
"c:\program files" -> TRUE
"C:\Documents and Settings" -> FALSE
"C:\Documents and Settings\All Users\Application Data" -> TRUE

PathIsUNC - 네트워크 공유 경로인지 확인한다. (실제로 존재하는지 확인하지는 않음)
"c:\abc\def" -> FALSE
"\\abc\def" -> TRUE
"\\192.168.0.1" -> TRUE
"\\abc\def.txt" -> TRUE
"\\" -> TRUE
"\\test.txt" -> TRUE

PathIsUNCServer - 네트워크 공유 서버인지 확인한다. (실제로 존재하는지 확인하지는 않음)
"c:\abc\def" -> FALSE
"\\abc\def" -> FALSE
"\\192.168.0.1" -> TRUE
"\\abc\def.txt" -> FALSE
"\\" -> TRUE
"\\test.txt" -> TRUE

PathIsUNCServerShare -  네트워크 공유 폴더인지 확인한다. (실제로 존재하는지 확인하지는 않음)
"c:\abc\def" -> FALSE
"\\abc\def" -> TRUE
"\\192.168.0.1" -> FALSE
"\\abc\def.txt" -> TRUE
"\\" -> FALSE
"\\test.txt" -> FALSE

PathIsURL - 주어진 경로가 URL 형식이 맞는지 확인한다.

PathMakePretty - 대문자로 만들어진 경로 문자열을 소문자로 변환한다. (소문자가 하나라도 있으면 실패)
"C:\ABC\DEF" -> TRUE, "C:\abc\def"
"c:\ABC\DEF" -> FALSE, "c:\ABC\DEF"
"C:\abc\DEF" -> FALSE, "C:\abc\DEF"

PathMakeSystemFolder - 지정된 폴더를 시스템 폴더로 만든다.

PathMatchSpec - 와일드카드 형식으로 파일명과 일치되는지 확인한다.
"test.txt", "*.txt" -> TRUE
"abc.txt", "ab?.*" -> TRUE
"c:\abc\def.txt", "*\???.txt" -> TRUE

PathParseIconLocation - 파일 경로와 아이콘 인덱스 번호를 분리한다.
"iexplore.exe, 1" -> 1, "iexplore.exe"

PathQuoteSpaces - 경로에 공백이 포함되어 있으면 큰따옴표로 묶어준다. 공백이 없으면 무시
c:\1. abc -> "c:\\1. abc"
c:\abc -> c:\abc

PathRelativePathTo - 한 경로에서 다른 경로로 가는 상대 경로를 추출한다. (같은 드라이브에서만 가능)
"c:\abc\def\ghi\jkl.txt", 0, "c:\abc\mno\pqr.txt", 0 -> TRUE, "..\..\mno\pqr.txt"
"c:\abc\def\ghi\jkl", FILE_ATTRIBUTE_DIRECTORY, "c:\abc\mno\pqr.txt", 0
-> TRUE, "..\..\..\mno\pqr.txt"
"c:\abc\def\ghi\jkl.txt", 0, "c:\abc\mno\pqr", FILE_ATTRIBUTE_DIRECTORY
-> TRUE, "..\..\mno\pqr"

PathRemoveArgs - 경로에 포함된 인자를 지운다.
"test.exe temp.txt sample.doc" -> "test.exe"
"test.exe sample All 15" -> "test.exe"
"test.exe" -> "test.exe"
"abc def ghi" -> "abc"

PathRemoveBackslash - 경로 끝에 백슬레시가 있으면 삭제한다.
"c:\abc\" -> "c:\abc"
"c:\abc" -> "c:\abc"

PathRemoveBlanks - 경로 앞뒤에 공백문자가 있으면 삭제한다.
"  c:\abc   " -> "c:\abc"

PathRemoveExtension - 확장자를 삭제한다.
"c:\abc\def.txt" -> "c:\abc\def"

PathRemoveFileSpec - 파일 이름을 삭제한다.
"c:\abc\def.txt" -> "c:\abc"
"c:\abc\def\" -> "c:\abc\def"

PathRenameExtension - 확장자를 교체한다.
"c:\abc\def.txt", ".bak" -> "c:\abc\def.bak"
"c:\abc\def", ".bak" -> "c:\abc\def.bak"
"c:\abc\def\", ".bak" -> "c:\abc\def\.bak"

PathSearchAndQualify - 주어진 경로의 오류를 바로잡고, 상대 경로도 정리하고, 환경 변수도 적용한다.
"C:\foo\." -> "C:\foo"
"C:\foo\baz\.." -> "C:\foo"
"C:\foo\\\baz" -> "C:\foo\baz"
"\\server\aa\..\bb" -> "\\server\aa\bb"
"notepad.exe" -> "C:\Windows\System32\notepad.exe"
"%SystemRoot%\System32\notepad.exe" -> "C:\Windows\System32\notepad.exe"
(XP에서는 환경변수 확장이 제대로 작동하지 않음)

PathSetDlgItemPath - 주어진 다이얼로그 아이템 윈도우의 크기에 알맞게 긴 경로를 적당히 줄여준다.

PathSkipRoot - 루트 경로를 제외한 첫번째 위치를 찾아서 반환한다.
"c:\abc\def" -> "abc\def"
"\\\\abc\\def\\ghi.txt" -> "ghi.txt"

PathStripPath - 가장 마지막 경로만 남기고 삭제한다.
"c:\abc\def.txt" -> "def.txt"
"c:\abc\def" -> "def"
"c:\abc\def\" -> "def\"

PathStripToRoot - 루트 경로만 남기고 삭제한다.
"c:\abc\def.txt" -> "c:\"
"c:\abc\def" -> "c:\"

PathUndecorate - 경로에서 임시 파일에 붙는 숫자를 삭제한다.
"C:\Path\File[5].txt" -> "C:\Path\File.txt"
"C:\Path\File[12]" -> "C:\Path\File"
"C:\Path\File.txt" -> "C:\Path\File.txt"
"C:\Path\[3].txt" -> "C:\Path\[3].txt"
인터넷으로 접근한 임시파일들은 [#]과 같은 식으로 번호가 뒤에 붙는데 그러한 임시 번호를 제거한다.

PathUnExpandEnvStrings - 경로에서 환경 변수에 해당하는 문자열을 환경 변수 이름으로 교체한다.
"c:\Windows\test.txt" -> "%SystemRoot%\test.txt"
"c:\program files\test.txt" -> "%ProgramFiles%\test.txt"
"c:\abc\def" -> "%SystemDrive%\abc\def"

PathUnmakeSystemFolder - 지정된 폴더의 시스템 속성을 해제한다.


PathUnquoteSpaces - 큰 따옴표로 감싸진 경로에서 따옴표를 제거한다.

"c:\abc\1 def" -> c:\abc\1 def
c:\abc\def -> c:\abc\def

 

 

 

 

(출처 : http://hiiroyui.egloos.com/5642217)

 

 

설정

트랙백

댓글

(WinAPI) 문자열 함수(멀티바이트->유니코드->TCHAR)

IT/Programming/WinAPI 2013. 7. 8. 07:38

strcpy -> wcscpy -> _tcscpy (문자열을 복사) 

strncpy -> wcsncpy -> _tcsncpy ( 사이즈 만큼 복사) 

strlen -> wcslen -> _tcslen (문자열 길이 확인)  

strcat -> wcscat -> _tcscat (두 문자열 이어 붙이기) 

strncat -> wcsncat -> _tcsncat (사이즈 만큼 이어 붙이기) 

strcmp -> wcscmp -> _tcscmp (문자열 비교) (반환 값(-1, 0, 1)) 

strncmp -> wcsncmp? -> _tcsncmp ( 사이즈 만큼 문자열 비교) 

stricmp -> wcsicmp -> _tcsicmp (대소문자를 구별하지 않고 문자열을 비교) 

strnicmp -> wcsnicmp -> _tcsnicmp (사이즈 만큼 대소문자를 구별하지 않고 문자열을 비교)

strchr -> wcschr -> _tcschr (문자 찾기) 

strrchr -> wcsrchr -> _tcsrchr (문자 찾기 (문자열 끝에서 부터 검색)) 

strstr -> wcsstr -> _tcsstr (문자열 찾기)

strpbrk -> wcspbrk -> _tcspbrk (문자 찾기 (두번째 인수를 찾고자 하는 문자들의 집합(문자열)으로 구성)   

strtok -> wcstok -> _tcstok (문자열 자르기 (두번째 인수를 집합(문자열)으로 구성 가능)) => 해당 문자가 NULL로 치환 됨

strset -> wcsset -> _tcsset (문자 치환, 첫째 인수의 모든 문자를 두번째 인수 문자로 변경함) => "abc" -> "bbb" 

strnset -> wcsnset -> _tscnset (사이즈 만큼 문자 치환) 

strupr -> wcsupr -> _tcsupr (대문자로 치환)

strlwr -> wcslwr -> _tcslwr (소문자로 치환) 

strrev -> wcsrev -> _tcsrev (문자열 역정렬) => "가나다라마" -> "마라다나가"

 

 

출처 : http://blog.naver.com/kilsu1024/110168931552

설정

트랙백

댓글

TCHAR 문자열을 printf() 할 때 발생하는 문제점의 원인

IT/Programming/WinAPI 2013. 7. 8. 07:07

되게 간단한건데, 왜 이리 자주 까먹는지 모르겠다.. -_-;

윈도우 프로그래밍에 익숙해지지 않아서인것 같다.

 

UNICODE 문자열 abc가 저장된다고 가정하면 아래와 같이 저장이 된다.

 

'a'\0 'b'\0 'c'\0 ...  (나의 조악한 표현에 묵념을..)

 

한 바이트마다 NULL 문자가 붙는 것이 특징인데,

printf()가 UNICODE를 지원하지 않아서 당연히 문자 하나밖에 출력이 되지 않는다.

 

자세한 설명이 있는 참고 링크 : http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=169408286&qb=dGNoYXIg7Lac66Cl&enc=utf8&section=kin&rank=1&search_sort=0&spq=0&pid=ROFP0F5Y7vlssaXBgdRssssssth-451584&sid=UdndiHJvLDsAAFnmOeY

설정

트랙백

댓글