관리 메뉴

Kim's Programming

파일처리함수(1/2) 본문

Programming/System Programming

파일처리함수(1/2)

Programmer. 2015. 12. 24. 03:21

파일의 열기 그리고 닫기


파일을 열떄는 다음의 CreateFile 함수를 이용하게 됩니다. CreateFile 함수는 다음과 같습니다.

1
2
3
4
5
6
7
8
9
CreateFile(
    LPCSTR lpFileName,
    DWORD dwDesiredAccess,
    DWORD dwShareMode,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD dwCreationDisposition,
    DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile
    );
cs


각 파라메터와 그에 들어갈 값 몇개만 알아보겠습니다.


    • lpFileName : 오픈할 파일의 이름을 지정

    • dwDesiredAccess : 읽기/쓰기 모드를 지정하며 or 연산자를 통해서 결합

      1. GENERIC_READ : 읽기 모드
      2. GENERIC_WRITE : 쓰기 모드

    • dwSharedMode : 파일 공유방식을 지정

      1. 0 : 다른 프로세스에 절대 공유 불가하며 오픈된 파일은 중복오픈 불가
      2. FILE_SHARE_READ : 다른 프로세스와 동시에 읽기 접근 가능
      3. FILE_SHARE_WRITE : 다른 프로세스와 동시에 쓰기 접근 가능

    • lpSecurityAttribute : 보안속성을 지정. 핸들을 자식 프로세스에게 상속할지 말지를 결정하기 위한 용도로 사용가능하며 NULL값 전달시 디폴트 보안속성을 적용

    • dwCreationDisposition : 파일이 생성되는 방법을 지정

      1. CREATE_ALWAYS : 항상 새 파일을 생성
      2. CREATE_NEW : 새파일 생성하며 같은 이름의 파일이 존재할때는 생성 실패
      3. OPEN_ALWAYS : 기존 파일 오픈, 없으면 생성
      4. OPEN_EXISTING : 기존 파일을 오픈, 존재하지 않으면 호출 실패
      5. TRUNCATE_EXISTING : 기존의 파일의 내용을 지우고 오픈하며 존재하지 않으면 호출 실패

    • dwFlagAndAttribute : 파일의 특성 정보를 설정하며, 둘 이상의 특성을 줄떄는 or연산자를 이용합니다. 기본적으론 FILE_ATTRIBUTE_NORMAL을 사용합니다.

    • hTemplateFile : 기존에 존재하는 파일과 동일한 특성을 가지는 새 파일을 만들 때 사용되는 전달 인자, 일반적으로는 NULL을 전달합니다.

함수 호출시에 성공하면 파일의 핸들이 반환이 됩니다. 그리고 파일을 종료할 때는 CloseHandle함수를 이용하여 종료합니다. 파일을 오픈할때도 커널 오브젝트가 생성되고 핸들이 반환됩니다.


파일의 읽기 그리고 쓰기, 포인터

파일에 있는 데이터를 읽을 때는 ReadFile()함수를 사용합니다. ReadFile함수는 다음과 같습니다.
1
2
3
4
5
6
7
ReadFile(
     HANDLE hFile,
     LPVOID lpBuffer,
     DWORD nNumberOfBytesToRead,
     LPDWORD lpNumberOfBytesRead,
     LPOVERLAPPED lpOverlapped
    );
cs
각 파라메터를 알아보겠습니다.

    • hFile : 데이터를 읽을 파일의 핸들을 지정합니다.
    • lpbuffer : 일어 들인 데이터를 저장할 버퍼(배열, 메모리)의 주소(포인터)를 지정합니다.
    • nNumberOfBytesToRead : 파일로부터 읽고자 하는 데이터의 크기를 바이트 단위로 지정합니다.
    • lpNumberOfByteToRead : 실제 읽어 들인 데이터 크기를 얻기 위한 변수의 주소를 지정합니다.
    • lpOverLapped : CreateFile 함수의 전달인자 dwFlagsAndAttributes와 설명이 같습니다.

파일에다가 데이터를 저장할 때는 WriteFile()함수를 하용합니다. WriteFile함수는 다음과 같습니다.
1
2
3
4
5
6
7
WriteFile(
    HANDLE hFile,
    LPCVOID lpBuffer,
    DWORD nNumberOfBytesToWrite,
    LPDWORD lpNumberOfBytesWritten,
    LPOVERLAPPED lpOverlapped
    );
cs
각 파라메터를 알아보겠습니다.

    • hFile : 데이터를 저장할 파일의 핸들을 지정합니다.
    • lpBuffer : 데이터를 저장하고 있는 버퍼(배열, 메모리)의 주소(포인터)를 지정합니다.
    • nNumberOfBytesToWrite : 파일에 저장하고자 하는 데이터 크기를 바이트 단위로 지정합니다.
    • lpNumberOfByteswritten : 파일에 실제 저장된 데이터 크기를 얻기 위해 변수의 주소를 지정합니다.
    • lpOverLapped : CreateFile 함수의 전달인자 dwFlagsAndAttributes와 설명이 같습니다.
그럼 위 두 함수를 이용해서 간단한 프로그램을 만들어 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<Windows.h>
#include<stdio.h>
#include<tchar.h>
 
int _tmain(int argc, TCHAR *argv[])
{
    TCHAR fileName[] = _T("data.txt");
    TCHAR Data_Write[] = _T("This is data");
    TCHAR Data_Read[100];
    HANDLE hFile_Write;
    HANDLE hFile_Read;
    DWORD numOfByteWritten = 0;
 
    hFile_Write = CreateFile(fileName, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    
    if (hFile_Write == INVALID_HANDLE_VALUE)
    {
        _tprintf(_T("Fail to CreatFile\n"));
        return -1;
    }
    WriteFile(hFile_Write, Data_Write, sizeof(Data_Write), &numOfByteWritten, NULL);
    _tprintf(_T("written data size : %d\n\n"), numOfByteWritten);
    CloseHandle(hFile_Write);
    //여기까지 파일 쓰기
    Sleep(3000);
 
    numOfByteWritten = 0;
    hFile_Read = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
 
    if (hFile_Read == INVALID_HANDLE_VALUE)
    {
        _tprintf(_T("Fail to CreateFile\n"));
        return -1;
    }
    ReadFile(hFile_Read, Data_Read, sizeof(Data_Read), &numOfByteWritten, 0);
    Data_Read[numOfByteWritten / sizeof(TCHAR)] = 0;
    
    _tprintf(_T("written data size : %d\n"), numOfByteWritten);
    _tprintf(_T("written data size : %s\n"), Data_Read);
    CloseHandle(hFile_Read);
    //여기까지 파일 읽기
    return 0;
}
cs

파일을 쓴 다음 그대로 읽어내는 프로그램입니다.

파일의 시간 정보 얻기




파일의 속성을 보면 여기서 확인할 수 있는 대표적인 정보는 위의 말풍선 안에 들어있는 3가지 입니다.

    • 만든 날짜
    • 수정한 날짜
    • 액세스 한 날짜
파일에서 다음의 정보를 얻기위해서는 GetFileTime()함수를 사용하면 됩니다. GetFileTime()함수의 구조는 다음과 같습니다.
1
2
3
4
5
6
GetFileTime(
    HANDLE hFile,
    LPFILETIME lpCreationTime,
    LPFILETIME lpLastAccessTime,
    LPFILETIME lpLastWriteTime
    );
cs
각 파라메터를 알아보겠습니다.

    • hFile : 시간 관련 정보를 얻을 대상 파일의 핸들을 지정
    • lpCreationTime : 파일이 생성된 시간을 얻기위해 FILETIME 구조체 변수의 주소값을 전달합니다. NULL을 전달하는 것도 가능합니다.
    • lpLastAccessTime : 파일의 마지막 접근 시간을 얻기 위해 FILETIME 구조체 변수의 주소값을 전달합니다. NULL을 전달하는 것도 가능합니다.
    • lpLastWriteTime : 파일의 마지막 데이터 갱신(덮어 쓰기 포함) 시간을 얻기 위해 FILETIME 구조체 변수의 주소값을 전달합니다. NULL을 전달하는 것도 가능합니다.


다음 포스팅에서는 GetFileTime()함수에서 사용한 FILETIME 구조체와 파일속성을 얻어오는 더 많은 함수들에 대해서 알아보겠습니다.