행복한 연어의 이야기

(윈도우 시스템) 18. 파일 I/O와 디렉터리 컨트롤 본문

IT/윈도우 시스템 프로그래밍

(윈도우 시스템) 18. 파일 I/O와 디렉터리 컨트롤

해피살몬 2021. 8. 25. 19:24

1. 기본적인 파일 처리 함수들

파일 열기 & 닫기

HANDLE CreateFile(
	LPCTSTR lpFileName,				//파일 이름
	DWORD dwDesiredAccess,				//읽기 쓰기 모드 지정
	DWORD dwShareMode,				//파일 공유방식
	LPSECURITY_ATTRIBUTES lpSecurityAttributes,	//핸들을 상속하기 위한 용도
	DWORD dwCreationDisposition,			//파일 생성 방법
	DWORD dwFlagsAndAttributes,			//파일 특성 정보
	HANDLE hTemplateFile				//기존에 존재하는 파일 특성 전달자 
);


BOOL CloseHandle(
	HANDLE hObject			
);

 

파일 읽기 & 쓰기

BOOL ReadFile(
	HANDLE hfile				//읽을 파일의 핸들
	LPCVOID lpBuffer			//읽은 데이터를 저장할 버퍼주소
	DWORD nNumberOfBytesToWrite		//데이터 크기(바이트 단위)
	LPDWORD lpNumberOfBytesWritten		//함수호출 완료후 실제 데이터를 얻기위한 변수 주소
	LPOVERLAPPED lpOverlapped
);
  
  
BOOL WriteFile(
	HANDLE hfile				//데이터를 저장할 파일의 핸들
	LPCVOID lpBuffer			//데이터를 저장하고 있는 버퍼
	DWORD nNumberOfBytesToWrite		//데이터 크기(바이트 단위)
	LPDWORD lpNumberOfBytesWritten		//함수호출 완료후 실제 데이터를 얻기위한 변수 주소
	LPOVERLAPPED lpOverlapped
);
    

 

파일 사이즈 얻어오기

DWORD GetFileSize(
      HANDLE hfile,		//파일 핸들
      LPDWORD lpFileSizeHigh	//반환값이 DWORD 이기 때문에 4바이트 이상 파일을 읽을때 사용
);

BOOL GetFileSizeEX(
      HANDLE hfile,		//파일 핸들
      PLARGE_INTEGER lpFileSize	//파일 크기를 저장하기 위한 변수의 포인터(주소값)
);

4 기가 바이트 이상 데이터의 사이즈를 얻기 위해서 GetFileSize 의 두번째 인자를 사용하거나

(상위 4바이트 정보를 가져온다.)

GetFileSizeEx 함수를 사용할 수 있다.

 

파일 특성 정보 얻기 & 적용하기

DWORD GetFileAttributes(
      LPCTSTR lpFIleName		//파일 이름
);

BOOL SetFileAttributes(
      LPCTSTR lpFileName,		//파일 이름
      DWORD dwFileAttributes		//변경할 특성 정보
);

BOOL GetFileInformationByHandle(
      HANDLE hfile,			//파일 핸들
      LPBY_HANDLE_FILE_INFORMATION lpFileInformation	//파일 정보 구조체의 포인터 타입
);

위 함수 2개는 파일 이름을 사용해서 특성 정보를 얻어오소

제일 아래 함수는 파일 핸들을 통해 파일 정보를 가져온다.

 

파일 경로 정보 얻어오기

GetFullPathNameW(
      LPCWSTR lpFileName,		//완전경로를 확인할 파일 이름
      DWORD nBufferLength,		//완전경로를 저장할 버퍼 길이(문자열 길이)
      LPWSTR lpBuffer,			//완전경로를 저장할 버퍼의 주소값
      LPWSTR* lpFilePart		//파일 이름이 반환
);

 

2. 디렉터리 관련 함수 및 그밖의 함수들

 

디텍터리 종류

현재 디렉터리

초기에는 프로그램이 로드된 디렉터리이며 이후 (프로그램 실행중에) 변경 가능하다.

시스템 디렉터리

각종 라이브러리(DLL) 및 드라이버 파일 처럼 Windows 시스템에 중요한 파일들이 존재한다. 변경 불가능 하다.

Window 디렉터리

초기화 및 실행파일이 존재한다. 변경 불가능 하다.

 

디렉터리 생성과 소멸

BOOL CreateDirectory(
      LPCTSTR lpPathName,				//생성하고자 하는 디렉터리 이름
      LPSECURITY_ATTRIBUTES lpSecurityAttributes	//보안속성 설정
);

BOOL RemoveDirectory(
      LPCTSTR lpPathName				//지울 디렉토리 이름
);	

 

현재 디렉터리 얻기 & 변경하기

DWROD GetCurrentDirectory(
      DWORD nBufferLenth,		//두번째 인자로 전달된 버퍼의 길이
      LPTSTR lpBuffer			//현재 디렉터리 정보를 저장할 버퍼의 주소값
);

BOOL SetCurrentDirectory(
      LPCSTR lpPathName			//변경하고자 하는 현재 디렉터리 정보를 지정
);

 

시스템 디렉터리 & Windows 디렉터리 얻기

UNIT GetSystemDirectory(
      LPTST lpBuffer,		//시스템 디렉터리 정보를 저장할 버퍼의 주소값
      UNIT uSize		//첫 번째 인자로 전달된 버퍼의 길이
);

UNIT GetWindowsDirectory(
      LPTST lpBuffer,		//WIndows 디렉터리 정보를 저장할 버퍼의 주소값
      UNIT uSize		//첫 번째 인자로 전달된 버퍼의 길이
);	

 

디렉터리에서 파일 찾기

DWORD SearchPathW(
    LPCWSTR lpPath,		//대상의 경로
    LPCWSTR lpFileName,		//찾을 파일 이름
    LPCWSTR lpExtension,	//파일의 확장자
    DWORD nBufferLength,	//완전경로명을 저장할 버퍼의 길이
    LPWSTR lpBuffer,		//완전경로명을 저장할 버퍼
    LPWSTR* lpFilePart		//파일 이름을 얻을 주소값
    );

첫번째 인자 대상의 경로에 NULL 이 오게 되면 다음과 같은 순서로 파일을 찾는다.

다음 순서를 표준 검색경로라고 한다.

1. 실행중인 프로그램이 로드된 디렉터리(실행파일이 존재하는 디렉터리)

2. 현재 디렉터리

3. 시스템 디렉터리

4. Windows 디렉터리

5. 환경변수 PATH 에 등록된 디렉터리

 

알고 넘어가야할 것

1. 데이터 입력과 출력

2. 4G 바이트 이상 대용량 파일 처리

3. 표준 검색경로

4. 어떤 기능들이 제공되는지

 

'윤성우 저자'님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍' 책을 보고 정리한 내용입니다.

 

 

Comments