파일 경로 관리(문자열 파싱)
코드에서 사용하는 경로는 문자열이라고 볼 수 있다.
코드상 경로에는 폴더와 파일 2가지로 나눠볼 수 있다.
find_last_of 함수
std::string 클래스에는 제공하는 여러가지 문자열 함수들이 있다.
find_last_of()는 인자값에 넣어주는 문자를 문자열의 가장 뒤에서부터
찾아서 리턴해준다.첫번째 인자에 찾고 싶은 문자를 넣고 두번째 인자에는
디폴트 인자로 -1값이 들어가 있는데 가장 뒤에서 부터 찾는것이고 예를들어 여기에
6을 직접 넣으면은 문자열의 6번째부터 뒤에서부터 입력한 문자를 찾아나간다.
D:\\AAAA\\BBBB\\CCCC\\DDDD.bmp
이런 파일경로가 있을경우 마지막 \\나오는곳을 찾아서 그 위치부터
문자열의 전체 사이즈의 -1 까지 문자열을 구하면 파일명을 가져올 수 있다.
그럴경우 find_last_of('\\') 이렇게 뒤에서부터 \\찾아서
리턴되는 값에서 전체 사이즈-1 까지의 문자를 가져오면 파일명을 가져올 수 있다.
만약 넣어준 문자를 못찾을 경우 -1을 한다.
substr 함수
위의 경우에서 substr 함수를 이용하면 되는데
함수 원형은 substr(size_t index = 0, size_t len = npos) 이렇게 되는데
string을 index에서 len만큼 잘래내서 반환해 주는 함수이다.
GetCurrentDirectory 함수
exe파일이 존재하는 디렉토리 경로를 반환해 주는 함수이다.
즉 현재 프로그램의 작업 경로를 얻어올 수 있다.
DWORD GetCurrentDirectory(DWORD nBufferLength, LPTSTR lpBuffer);
함수의 원형의 위와 같으며 첫번째 인자인 nBufferLength에는 자신이 작업 경로를
저장하기 위해 전달한 메모리의 크기를 적어주면 된다.즉, 두번째 인자로 전달되는
lpBuffer 메모리의 크기를 적어주면 된다. 두번째 인자로 전달되는 lpBuffer에는
작업 경로를 저장할 메모리의 주소가 전달된다. 이 함수가 성공적으로 동작해서
작업 경로를 얻었으면 lpBuffer 변수에 실제로 저장한 문자열의 길이가 반환된다.
실패하면 0이 반환된다.
이 함수는 유니코드와 아스키 코드르를 사용하는 함수를 같이 제공하는데
GetCurrentDirectoryW 는 유니 코드
GetCurrentDirectoryA 는 아스키 코드를 사용하는 함수이다.
_access 함수
파일,디렉토리 상관없이 경로에 존재하는지 쓰기,읽기 전용인지를 확인해주는 함수이다
#include <io.h>
int _access(
const char *path,
int mode
);
함수의 원형은 위와 같으며 io 헤더가 필요하다.
인자값에는
path : 파일 또는 디렉토리 경로
mode : 0 -> 존재 여부
2 -> 쓰기 전용
4 -> 읽기 전용
6 -> 읽기 및 쓰기
반환값으로는 mode에 넣은값이 true이면 0을 반환한다.
FindFirstFile 함수 , FindNextFile 함수
윈도우에서 사용 가능한 함수로 파일을 검색하는 코드이다.
FindFirstFile 함수를 통해 첫번째 검색된 파일 정보를 찾고 저장할 구조체 변수를 넣어주면
거기에 정보를 담아준다.(구조체는 WIN32_FIND_DATA 사용한다.)
FindNextFile 함수를 통해서 FindFirstFile에서 얻은 핸들을 넣어주면
FindFirstFile에서 얻은 첫번째 검색을 바탕으로 2~n번째 파일을 찾을 수 있다.
검색이 다 끝난후에는 FindClose(FindFirstFile에서 얻은 핸들) 함수를 통해
핸들을 반환해준다.
FindFirstFile 함수의 원형
HANDLE FindFirstFile(
LPCTSTR lpFileName,
LPWIN32_FIND_DATA lpFindFileData
);
lpFileName : 파일 검색을 위한 파일 이름.
lpFindFileData : 파일 검색용 데이터 구조체다. 검색된 파일들의 정보가 담겨진다.
WIN32_FIND_DATA 구조체
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
TCHAR cFileName[MAX_PATH];
TCHAR cAlternateFileName[14];
} WIN32_FIND_DATA,
*PWIN32_FIND_DATA;
파일 검색 문자열이 잘못 되었거나 다른 이유로 함수 실행이 실패했을 경우
NVALID_HANDLE_VALUE로 Define된 상수값을 반환한다.
성공했을 경우 파일 검색 핸들을 반환하고 두 번째로 전달되는 구조체에
첫 번째로 발견되는 파일의 정보를 넣어준다.
FindNextFile 함수 원형
BOOL FindNextFile(
HANDLE hFindFile,
LPWIN32_FIND_DATA lpFindFileData
);
hFindFile : FindFirstFile이 넘겨준 핸들을 넣는다.
lpFindFileData : 파일 검색용 구조체. FindFirstFile이 넘겨준 구조체를 주면 된다.
함수 실행이 성공하였을 경우 TRUE를 반환하고 실패하였을 경우 FALSE를 반환한다.
함수 성공시 두번째 인자로 전해지는 구조체에 파일의 정보를 넣어준다.
이 함수를 이용하여 원하는 폴더내의 모든 파일들을 편리하게 가져올 수 있다.