1. 현재 경로(path) 알아내기 및 변경하기
2. 파일 읽기/열기(file read/open) 경로(path) 얻기
3. 파일 저장(write/save/create) 경로 얻기
4. 폴더 경로명 얻기 (folder open)
5. 현재 경로를 루트(root)로 폴더 선택하기 (Unicode encoding)
6. 현재 경로를 루트(root)로 폴더 선택하기 (Multi-Byte or No encoding)
7. 현재 폴더(디렉토리)의 파일 목록(리스트) 접근하기
8. 경로 분해하기
9. 현재 날짜, 시간을 파일명에 덧붙이기
10. 상위 디렉토리(폴더)로 이동하기
11. 코드 다운로드
1. 현재 경로(path) 알아내기 및 변경하기
TCHAR sPath[MAX_PATH] = {0,};
::GetCurrentDirectory(MAX_PATH, sPath);
::SetCurrentDirectory(_T("c:"));
2. 파일 읽기/열기(file read/open) 경로(path) 얻기
파일 열기 대화상자 사용법입니다. 아래 예제에서는 avi 파일을 열도록 필터를 설정했습니다. 필터 없이 모든 파일을 보여주려면 lpstrFilter에 NULL을 주면 됩니다.
TCHAR szFilePath[MAX_PATH] = {0,};
OPENFILENAME ofn;
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = NULL;
ofn.lpstrFile = szFilePath;
ofn.nMaxFile = sizeof(szFilePath);
ofn.lpstrFilter = _T("Avi Files(*.avi) *.avi All Files (*.*) *.* ");
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if(::GetOpenFileName(&ofn)==false) return;
TCHAR *return_path = ofn.lpstrFile;
3. 파일 저장(write/save/create) 경로 얻기
파 일 저장 대화상자 사용법입니다. 아래 예와 같이 필터(*.avi)를 사용한다고 해서 자동으로 avi가 확장자로 붙는건 아닙니다. 사용자가 입력한 경로명을 보고 필요한 경우 프로그래머가 직접 확장자를 추가해 주어야 합니다. 필터를 해제하려면 lpstrFilter에 NULL을 주면 됩니다.
TCHAR szFile[260] = _T("");
OPENFILENAME ofn;
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = NULL;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = _T("Avi Files(*.avi) *.avi All Files (*.*) *.* ");
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_OVERWRITEPROMPT;
if(::GetSaveFileName(&ofn)==false) return;
TCHAR *return_path = ofn.lpstrFile;
4. 폴더 경로명 얻기 (folder open)
파일이 아닌 폴더(디렉토리)를 열고자 할 때는 다음과 같이 합니다.
TCHAR cpath[MAX_PATH] = _T("");
LPITEMIDLIST pDirList;
BROWSEINFO browseInfo;
browseInfo.hwndOwner = NULL;
browseInfo.pidlRoot = NULL;
browseInfo.lpszTitle = _T("이미지들을 불러올 폴더를 선택해 주세요");
browseInfo.pszDisplayName = cpath;
browseInfo.ulFlags = BIF_RETURNONLYFSDIRS;
browseInfo.lpfn = NULL;
browseInfo.lParam = 0;
pDirList = SHBrowseForFolder(&browseInfo);
if(pDirList == NULL) return;
SHGetPathFromIDList(pDirList, cpath);
TCHAR *return_path = cpath;
5. 현재 경로를 루트(root)로 폴더 선택하기 (Unicode encoding)
현재 프로그램이 실행되는 폴더/경로를 루트로 폴더 열기 대화상자를 생성합니다 (Unicode 인코딩을 사용할 경우).
// set current directory to be root directory
TCHAR sPath[MAX_PATH] = {0};
::GetCurrentDirectory(MAX_PATH, sPath);
LPITEMIDLIST pStartDir;
ULONG nCharsParsed = 0;
LPSHELLFOLDER pShellFolder = NULL;
SHGetDesktopFolder(&pShellFolder);
HRESULT hr = pShellFolder->ParseDisplayName(NULL, NULL, sPath, &nCharsParsed, &pStartDir, NULL);
pShellFolder->Release();
// Get directory from user
TCHAR cpath[MAX_PATH];
LPITEMIDLIST pDirList;
BROWSEINFO browseInfo;
browseInfo.hwndOwner = NULL; // m_hWnd
browseInfo.pidlRoot = pStartDir;
browseInfo.lpszTitle = _T("이미지들을불러올폴더를선택해주세요");
browseInfo.pszDisplayName = cpath;
browseInfo.ulFlags = BIF_RETURNONLYFSDIRS;
browseInfo.lpfn = NULL;
browseInfo.lParam = 0;
pDirList = SHBrowseForFolder(&browseInfo);
if(pDirList == NULL) return;
SHGetPathFromIDList(pDirList, cpath);
TCHAR *return_path = cpath;
6. 현재 경로를 루트(root)로 폴더 선택하기 (Multi-Byte or No encoding)
현재 프로그램이 실행되는 폴더/경로를 루트로 폴더 열기 대화상자를 생성합니다 (Multi-byte 인코딩을 사용할 경우 또는 인코딩을 설정하지 않았을 경우).
// set current directory to be root directory
TCHAR sPath[MAX_PATH] = {0};
::GetCurrentDirectory(MAX_PATH, sPath);
OLECHAR wszPath[MAX_PATH] = {0};
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (LPCSTR)sPath, -1, wszPath, MAX_PATH);
LPITEMIDLIST pStartDir;
ULONG nCharsParsed = 0;
LPSHELLFOLDER pShellFolder = NULL;
SHGetDesktopFolder(&pShellFolder);
HRESULT hr = pShellFolder->ParseDisplayName(NULL, NULL, wszPath, &nCharsParsed, &pStartDir, NULL);
pShellFolder->Release();
// Get directory from user
TCHAR cpath[MAX_PATH];
LPITEMIDLIST pDirList;
BROWSEINFO browseInfo;
browseInfo.hwndOwner = NULL; // m_hWnd
browseInfo.pidlRoot = pStartDir;
browseInfo.lpszTitle = _T("이미지들을불러올폴더를선택해주세요");
browseInfo.pszDisplayName = cpath;
browseInfo.ulFlags = BIF_RETURNONLYFSDIRS;
browseInfo.lpfn = NULL;
browseInfo.lParam = 0;
pDirList = SHBrowseForFolder(&browseInfo);
if(pDirList == NULL) return;
SHGetPathFromIDList(pDirList, cpath);
TCHAR *return_path = cpath;
7. 현재 폴더(디렉토리)의 파일 목록(리스트) 접근하기
아래 예는 현재 경로의 폴더에 있는 모든 txt 파일의 파일이름을 출력하는 예입니다. 모든 파일을 접근하고 싶으면 _findfirst(“*.*”,&c_file)와 같이 하면 됩니다.
struct _finddata_t c_file; intptr_t hFile = _findfirst("*.txt", &c_file); if(hFile==-1) return; // no files do { if(c_file.attrib & _A_SUBDIR) { // directory 처리 } else if(c_file.attrib & _A_HIDDEN) { // hidden file 처리 } else { // 일반 파일 처리 printf("%sn", c_file.name); } } while(_findnext(hFile, &c_file)==0); _findclose(hFile);
8. 경로 분해하기
파일 경로를 드라이브, 디렉토리, 파일명, 확장자로 분리하는 함수입니다.
char fdrive[5];
char fdir[200];
char fname[100];
char fext[10];
_splitpath_s(path, fdrive, 5, fdir, 200, fname, 100, fext, 10);
9. 현재 날짜, 시간을 파일명에 덧붙이기
반복적으로 파일을 저장해야 하는 경우 현재 시간을 파일명에 덧붙이면 나중에 참조할 때 편리하기도 하고 또한 기존 파일을 실수로 덮어쓰는 것을 방지할 수 있습니다.
char save_path[MAX_PATH];
SYSTEMTIME st;
GetLocalTime(&st);
sprintf_s(save_path, MAX_PATH, "filepath_%d.%d.%d_%d.%d.txt", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute);
10. 상위 디렉토리(폴더)로 이동하기
현재 경로의 parent directory로 이동하기 위한 방법입니다.
TCHAR path[MAX_PATH] = {0,}; ::GetCurrentDirectory(MAX_PATH, path); int i = _tcslen(path) - 1; while(i>=0 && path[i]!='') i--; if(i<=0) return; path[i] = 0; ::SetCurrentDirectory((LPCTSTR)path);
출처 : http://darkpgmr.tistory.com/35
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
27 | MFC의 다각형 그리기 | pjk | 2014.05.24 | 16174 |
26 | 메모리 비트맵 | pjk | 2014.05.24 | 4369 |
25 | Visual Studio MFC에서 디버깅용 콘솔 창 띄우기 | pjk | 2014.05.24 | 8424 |
24 | 쓰레드 동기화 기법 | pjk | 2014.05.24 | 4996 |
23 | 선의 스타일과 색상 및 굵기 지정방법 | pjk | 2014.05.24 | 4740 |
22 | PictureControl 크기 구하기 | pjk | 2014.05.24 | 4392 |
21 | 체크박스가 선택되어 있는지 확인하는 GetCheck() | pjk | 2014.05.24 | 7658 |
20 | DC(Device Context) | pjk | 2014.05.24 | 5100 |
19 | 키보드 입력을 처리하기 | pjk | 2014.05.24 | 5225 |
18 | 양끝이 평평한 pen(펜)의 굵기와 색깔 지정해서 선 그리기 | pjk | 2014.05.26 | 4471 |
17 | 원의 중심과 반지름을 이용한 원 그리기 | pjk | 2014.05.30 | 7220 |
16 | 세 점을 지나는 원 (3 Point Circle) | pjk | 2014.06.05 | 11303 |
15 | SetPixel() 을 사용하여 원을 그리기... | pjk | 2014.06.05 | 10566 |
14 | 두점을 지나고 반지름을 알고있을 때 원의 중심점을 찾기 | pjk | 2014.06.09 | 8979 |
13 | MFC 대화상자 종료 메시지 호출 순서 | pjk | 2014.06.19 | 5483 |
12 | FindFirstFile() | pjk | 2014.07.18 | 5815 |
11 | WinCE 디버그메시지 사용법(DEBUGMSG, RETAILMSG, ERRORMSG, NKDbgPrintfW) | pjk | 2014.07.21 | 5786 |
» | 디렉토리(directory) 접근 C++ Win32 함수 총정리 | pjk | 2014.10.13 | 5035 |
9 | 윈도우 프로그래밍에서의 데이터 형 | pjk | 2014.10.13 | 5229 |
8 | WndProc | pjk | 2014.10.17 | 4058 |