'ReadFile'에 해당되는 글 2건

  1. 2010.03.08 파일 I/O (2)
  2. 2010.02.11 프로세스간 통신(IPC) - 메일 슬롯(MailSlot)
파일 열기 :

HANDLE CreateFile(
      LPCTSTR lpFileName,                // 개방(open)할 파일 이름
      DWORD dwDesiredAccess,          // 읽기/쓰기 모드를 지정한다.(or (l) 연산으로 결합)
                                                          GENERIC_READ : 읽기 모드
                                                          GENERIC_WRITE : 쓰기 모드
      DWORD dwShareMode,               // 파일 공유방식 
                                                          0 : 다른 프로세스에 절대 공유 불가. 중복 개방 불가
                                                          FILE_SHARE_READ : 다른 프로세스에서 동시 읽기 접근 가능
                                                          FILE_SHARE_WRITE : 다른 프로세스에서 동기 쓰기 접근 가능
      LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 보안 속성
      DWORD dwCreationDisposition,    // 파일의 생성되는 방법을 지정
                                                          CREATE_ALWAYS : 항상 새 파일을 생성
                                                          CREATE_NEW : 새 파일 생성, 같은 이름의 파일이 존재하면 생성 실패
                                                          OPEN_ALWAYS : 기존 파일 개방. 없으면 생성
                                                          OPEN_EXISTING : 기존 파일 개방, 존재하지 않으면 함수 호출 실패
                                                          TRUNCATE_EXISTING : 기존 파일의 내용 지우고 개방.
      DWORD dwFlagsAndAttributes,     // 파일의 특성 정보를 설정 (기본적 FILE_ATTRIBUTE_NORMAL 사용)
      HANDLE hTemplateFile               // 기존에 존재하는 파일과 동일한 특성을 가지는 새 파일을 만들때 사용
);


파일 쓰기(저장) :

BOOL WriteFile(
      HANDLE hFile,                                  // 데이터를 읽어 들일 파일을 지정(Mail Slot)
      LPCVOID lpBuffer,                             // 전송할 데이터가 저장되어 있는 버퍼 지정
      DWORD nNumberOfBytesToWrite,       // 전송할 데이터 크기를 지정한다  
      LPDWORD lpNumberOfBytesWritten,    // 함수 호출 완료 후 전송된 실제 데이터의 크기를 바이트 단위로
                                                                얻기 위한 변수의 주소 지정
      LPOVERLAPPED lpOverlapped           //
);


파일 읽기 :

BOOL ReadFile(
      HANDLE hFile,                                  // 해당 파일(Mail Slot)에 존재하는 데이터를 읽어들인다
      LPCVOID lpBuffer,                             // 읽어 들인 데이터를 저장할 버퍼 지정
      DWORD nNumberOfBytesToWrite,       // 읽어 들일 데이터의 최대 크기 지정  
      LPDWORD lpNumberOfBytesWritten,    // 함수 호출 완료 후 읽어 들인 실제 데이터의 크기를 바이트 단위로
                                                                얻기 위한 변수의 주소 지정
      LPOVERLAPPED lpOverlapped           //
);

파일입출력 예제



파일 포인터의 이동 :

DWORD SetFilePointer(
          HANDLE hFile,                                  // 파일 포인터 위치를 이동시킬 대상 파일의 핸들을 지정
          LONG lDistanceToMove,                    // 이동시킬 거리를 지정 ( 64 비트 환경에서 하위 4 바이트)
          PLONG lpDistanceToMoveHigh,          // 64 비트 기반의 대용량 파일에서만 의미 (상위 4 바이트 표현 )
                                                                 // 32비트 환경에서는 NULL
          DWORD dwMoveMethod                     // 파일 포인터 이동시 기준 위치 지정 : 앞 : FILE_BEGIN
);                                                                                                                     현재위치 : FILE_CURRENT
                                                                                                                       뒤 : FILE_END
예외처리 :

32비트 : if(dwPtr == INVALID_SET_FILE_POINTER)       64비트 : if((dwPtrLow == INVALID_SET_FILE_POINTER)
            {                                                                                && (GetLatError() != NO_ERROR)) 
                        예외처리                                                     {
            }                                                                                          예외처리
                                                                                         }
(참고 : 64비트에서 4G바이트 이상의 대용량파일을 다루기 때문에 파일의 위치가 0xFFFFFFFF 가 되는데 이는
          INVALID_SET_FILE_POINTER 값과 같으므로 GetLastError 함수호출을 통해 반환값을 확인해줘야한다)



파일의 시간 정보 얻어오기 :

BOOL GetFileTime(
         HANDLE hFile,                             // 시간 관련 정보를 얻을 대상 파일의 핸들
         LPFILETIME lpCreationTime,         // 파일이 생성된 시간을 얻기 위한 FILETIME 구조체 변수주소
         LPFILETIME lpLastAccessTime,    // 파일의 마지막 접근 시간을 얻기 위한 FILETIME 구조체 변수주소
         LPFILETIME lpLastWriteTime,        // 파일의 마지막 데이터 갱신(덮어 쓰기 포함) 시간을 얻기 위한
};                                                         // FILETIME 구조체 변수주소
(참고 : 세가지 시간 정보중 원하지 않는 시간 정보에 NULL 전달)


FILETIME 구조체 :                                 SYSTEMTIME 구조체 :

typedef struct _FILETIME {                     typedef struct _SYSTEMTIME {
         DWORD dwLowDateTime;                      WORD wYear;
         DWORD dwHighDateTime;                      WORD wMonth;
} FILETIME, *PFILETIME;                               WORD wDayOfWeek;
                                                                    WORD wDay;
                                                                    WORD wHour;
                                                                    WORD wMinute;
                                                                    WORD wSecond;
                                                                    WORD wMilliseconds;
                                                          } SYSTEMTIME, *PSYSTEMTIME;

FILEITME 구조체는 시간 정보를 UTC 기반으로 나타내는 8바이트 자료형(DWORD*2)이다.
(참고 : UTC 시간 : 1601년 1월 1일을 기준으로 100 나노초 단위 기준으로 지나간 시간을 계산
SYSTEMTIME 구조체도 UTC 시간 기반이다)


BOOL FileTimeToSystemTime(                     // FILETIME 포맷을 SYSTEMTIME 포맷으로 변경하는 함수.
           CONST FILETIME *lpFileTime,           // UTC 정보가 들어있는 FILETIME 구조체 변수주소
           LPSYSTEMTIME lpSystemTime         // SYSTEMTIME 구조체 변수주소
);


BOOL SystemTimeToTzSpecificLocalTime(                 // UTC 기반시간을 현재 시스템시간으로 변경하는 함수.
            LPTIME_ZONE_INFORMATION lpTimeZone,    // TIME_ZONE_INFORMATION 구조체 변수주소
                                                                               // NULL : 현재 시스템의 지역정보
            LPSYSTEMTIME lpUniversalTime,            // UTC 시간정보가 들어있는 SYSTEMTIME 구조체 변수주소
            LPSYSTEMTIME lpLocalTime                 // 지역시간을 넘겨받을 SYSTEMTIME 구조체 변수주소
);

파일시간 예제


(추가 : SetFileTIme 함수를 이용하면 함수의 시간 정보를 변경할수 있다.

BOOL SetFileTime(
HANDLE hFile,                                            // 시간 정보를 변경하고자 하는 파일의 핸들
CONST FILETIME *lpCreationTime,               // 파일의 생성시간 변경
CONST FILETIME *lpLastAccessTime,          // 파일의 마지막 접근시간 변경
CONST FILETIME *lpLastWriteTime               // 파일의 마지막 데이터 갱신 시간 변경
);



파일 사이즈 얻어오기 :

BOOL GetFileSizeEx(                    
        HANDLE hFile,                        // 파일 핸들을 지정한다.  
        PLARGE_INTEGER lpFileSize   // 파일 크기를 저장하기 위한 변수주소(LARGE_INTEGER = 8바이트 자료형)
);


파일의 특성(Attribute) 정보 얻어오기 :


DWORD GetFileAttributes(
        LPCTSTR lpFileName      // 특성정보를 얻고자 하는 파일의 핸들을 지정.
);  // 파일의 특성 정보를 DWORD 로 반환 (비트 단위로 의미 부여)

ex.    #define FILE_ATTRIBUTE_READONLY 0x00000001
         #define FILE_ATTRIBUTE_HIDDEN      0x00000002


BOOL SetFileAttributes(
       LPCTSTR lpFileName,         // 특성 정보를 변경하고픈 파일의 이름을 지정
       DWORD dwFileAttributes       // 변경할 특성 정보 전달
);


BOOL GetFileInformationByHandle(
     HANDLE hFile,                                                        // 정보를 얻고자 하는 파일의 핸들
     LPBY_HANDLE_FILE_INFORMATION lpFileInformation // BY_HANDLE_FILE_INFORMATION 구조체 변수주소
);

파일의 특성정보와 시간정보 파일 크기 정보를 비롯한 추가적인 파일 시스템 정보들도 얻을 수 있다.

typedef struct _BY_HANDLE_FILE_INFORMATION
{
         DWORD dwFileAttributes;
         FILETIME ftCreationTime;
         FILETIME ftLastAccessTime;
         FILETIME ftLastWriteTime;
         DWORD dwVolumSerialNumber;
         DWORD nFileSizeHigh;
         DWORD nFileSizeLow;
         DWORD nNumberOfLinks;
         DWORD nFileIndexHigh;
         DWORD nFileIndexLow;
} BY_HANDLE_FILE_INFORMATION, * BY_HANDLE_FILE_INFORMATION;

파일 정보 출력 예제



파일의 경로(PATH) 얻기 :

DWORD GetFullPathName(
           LPCTSTR lpFileName,           // 완전경로(Full Path)를 확인하고자 하는 파일 이름을 전달한다.
           DWORD nBufferLength,           // 완전경로를 저장할 버퍼에 저장 가능한 문자열 길이를 지정한다.
           LPTSTR lpBuffer,                   // 완전경로를 저장할 버퍼의 주소값을 지정한다.
           LPTSTR *lpFilePart                // 버퍼의 저장된 값중 파일의 이름값을 가리키는 포인터
);

파일경로 얻기 예제

'Windows > _System Programming' 카테고리의 다른 글

비동기 I/O 와 APC  (0) 2010.03.08
디렉터리 컨트롤  (0) 2010.03.08
파일 I/O  (2) 2010.03.08
가상 메모리(Virtual Memory)  (0) 2010.03.07
쓰레드(Thread) 동기화 예제 소스  (0) 2010.03.06
쓰레드(Thread) 동기화 개념  (0) 2010.03.04
Posted by Dakuo

IPC (Inter-Process Communication) : 프로세스 사이의 통신


메일 슬롯(Mail Slot)의 원리 :

프로세스는 자신에게 할당된 메모리 공간 이외에는 접근할 수가 없다.

따라서 Mail Slot (우체통)을 이용하여 데이터를 송·수신한다.

데이터를 수신하고자 하는 프로세스 A(Receiver)가 Mail Slot 을 생성한다.

데이터를 송신하고자 하는 프로세스 B(Sender)가 프로세스 A의 Mail Slot 의 주소로 데이터를 송신한다.

프로세스 A가 자신의 Mail Slot 을 통해 데이터를 얻게 된다.



메일 슬롯(Mail Slot) 구성 :

Recevier :

Mail Slot 를 생성한다.

HANDLE CreateMailslot(
      LPCTSTR lpName,                 // 메일슬롯 주소
      DWORD nMaxMessageSize,    // 메일슬롯의 버퍼 크기
      DWORD lReadTimeout,            // 최대 블로킹 시간(밀리세컨드 : ms) 
      LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 핸들 상속 여부
};

Mail Slot 에 들어있는 데이터를 읽어온다.

BOOL ReadFile(
      HANDLE hFile,                                  // 해당 파일(Mail Slot)에 존재하는 데이터를 읽어들인다
      LPCVOID lpBuffer,                             // 읽어 들인 데이터를 저장할 버퍼 지정
      DWORD nNumberOfBytesToWrite,       // 읽어 들일 데이터의 최대 크기 지정  
      LPDWORD lpNumberOfBytesWritten,    // 함수 호출 완료 후 읽어 들인 실제 데이터의 크기를 바이트 단위로
                                                                얻기 위한 변수의 주소 지정
      LPOVERLAPPED lpOverlapped           //
);


Sender :

Mail Slot 의 주소를 얻는다.
(예: "\\\\컴퓨터이름\\mailslot\\[path]name", (아스키코드 기반), 로컬컴퓨터 : . (컴퓨터이름))

해당 Mail Slot 과 연결한다.

HANDLE CreateFile(
      LPCTSTR lpFileName,                // 개방(open)할 파일 이름
      DWORD dwDesiredAccess,          // 읽기/쓰기 모드를 지정한다.(or (l) 연산으로 결합)
                                                          GENERIC_READ : 읽기 모드
                                                          GENERIC_WRITE : 쓰기 모드
      DWORD dwShareMode,               // 파일 공유방식 
                                                          0 : 다른 프로세스에 절대 공유 불가. 중복 개방 불가
                                                          FILE_SHARE_READ : 다른 프로세스에서 동시 읽기 접근 가능
                                                          FILE_SHARE_WRITE : 다른 프로세스에서 동기 쓰기 접근 가능
      LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 보안 속성
      DWORD dwCreationDisposition,    // 파일의 생성되는 방법을 지정
                                                          CREATE_ALWAYS : 항상 새 파일을 생성
                                                          CREATE_NEW : 새 파일 생성, 같은 이름의 파일이 존재하면 생성 실패
                                                          OPEN_ALWAYS : 기존 파일 개방. 없으면 생성
                                                          OPEN_EXISTING : 기존 파일 개방, 존재하지 않으면 함수 호출 실패
                                                          TRUNCATE_EXISTING : 기존 파일의 내용 지우고 개방.
      DWORD dwFlagsAndAttributes,     // 파일의 특성 정보를 설정 (기본적 FILE_ATTRIBUTE_NORMAL 사용)
      HANDLE hTemplateFile               // 기존에 존재하는 파일과 동일한 특성을 가지는 새 파일을 만들때 사용
);

해당 Mail Slot 에 데이터를 전송한다.

BOOL WriteFile(
      HANDLE hFile,                                  // 데이터를 읽어 들일 파일을 지정(Mail Slot)
      LPCVOID lpBuffer,                             // 전송할 데이터가 저장되어 있는 버퍼 지정
      DWORD nNumberOfBytesToWrite,       // 전송할 데이터 크기를 지정한다  
      LPDWORD lpNumberOfBytesWritten,    // 함수 호출 완료 후 전송된 실제 데이터의 크기를 바이트 단위로
                                                                얻기 위한 변수의 주소 지정
      LPOVERLAPPED lpOverlapped           //
);



메일 슬롯의 특징 :

메일슬롯에 할당된 주소를 기반으로 통신하기 떄문에 관계없는 프로세스들 사이에서도 통신이 가능하다.

(네트워크 연결되어 통신하는 프로세스들이나 부모 자식간의 연관 관계가 없는 프로세스들)


한쪽 방향으로만 메시지를 전달할 수 있다.

(서로 데이터를 주고 받기 위해서는 각각 메일슬롯을 생성해야 한다)


브로드캐스팅(Broadcasting) 방식의 통신을 지원한다.

Sender 는 한번의 메시지 전송으로 여러 Receiver 에게 동일한 메시지를 동시에 전송하는 것이 가능하다.

(예 :

컴퓨터 이름이 와야 하는 부분에 '*' 을 사용하면 네트워크에 연결되어 있는 모든 컴퓨터를 지칭한다.

따라서 모든 컴퓨터에 해당 주소로 생성된 메일슬롯에 동일한 메시지가 전달된다)

Posted by Dakuo