비공개2011. 5. 12. 11:39


 먼저, 이 함수를 다시 보게 되는 이유는! 내가 몸 담고 있는 프로젝트에서 발생한 일 때문이다.
 PC 내에서 응용프로그램을 두개 실행시켰을 때!!
 특정 상황에서 동시 파일 접근시 문제가 발생 하였다.

 FILE_SHARE_WRITE -> FILE_SHARE_READ 로 문제 해결!


파일을 생성하거나 기존파일이나 I/O 디바이스를 열기 위한 win32표준 함수

I/0 디바이스 : file, file stream, directory, physical disk, volume, console buffer, 
                    tape drive, communications resource, mailslot, pipe

 
HANDLE WINAPI CreateFile(
            LPCTSTR lpFileName,
            DWORD dwDesiredAccess,
            DWORD dwShareMode,
            LPSECURITY_ATTRIBUTES lpSecurityAttributes,
            DWORD dwCreationDisposition,
            DWORD dwFlagsAndAttributes,
            HANDLE hTemplateFile
);


lpFileName
 ┣> 열거나 읽을 파일이름
 ┣> 파일이름은 전체 경로를 줘야 함(최대 길이 :  MAX_PATH = 260 바이트)
 ┣> 파일 길이가 초과 할 경우 유니코드 버전 호출 후 "
\\?\"를 덧붙여 주면 됨
 ┃  (단, win CE에서는 "
\\?\" 문자열을 지원하지 않음)
 ┗> 네트워크 서버 참조 할 때는  "\\<서버 name>\<공유 name>" 형식으로 사용

===================================================================================

dwDesiredAccess
 ┣> 장치나 파일을 어떤 모드로 액세스 할 지 정해주는 부분
 ┣> GENERIC_READ(읽기 권한), GENERIC_WRITE(쓰기 권한)
 ┗> 0을 이용하여 읽기나 쓰기를 사용하지 않거나 OR을 이용하여 중복사용 가능

===================================================================================

dwShareMode
 ┣> 파일을 어떤 특성으로 열것인가를 설정하는 부분(읽기, 쓰기)
 ┗> FILE_SHARE_READ(파일 읽기만 가능), FILE_SHARE_WRITE(파일 쓰기만 가능)

===================================================================================

lpSecurityAttributes
 ┣> 리턴된 핸들을 차일드 프로세스로 상속할 것인지 아닌지를 지정하는 SECURITY_ATTRIBUTES 구조체 포인터
 ┣> NULL을 사용할 경우 사용하지 않음
 ┗> 
WIN CE에서는 lpSecurityAttributes 파라미터를 무시하므로 무조건 NULL

===================================================================================

dwCreationDisposition
 ┣> 파일을 어떻게 열고 생성을 할 것은지에 대해서 설정
 ┃
 ┣> CREATE_NEW
 ┃            ┗ 새로운 파일 생성, 이미 파일이 존재하면 실패
 ┣> CREATE_ALWAYS
 ┃            ┗ 새로운 파일을 생성하거나, 파일이 있을 시 파일을 덮어씀(크기: 0BYTE)
 ┣> OPEN_EXISTING
 ┃            ┗ 기존 파일이 있으면 파일을 열고, 없으면 에러 코드 발생
 ┣> OPEN_ALWAYS
 ┃            ┗ 파일이 존재하지 않으면 생성하고, 파일이 있으면 기존파일을 연다
 ┗> TRUNCATE_EXISTING
               ┗ 기존파일을 열고 기존파일을 0 BYTE로 초기화 시킴
                   GENERIC_WRITE로 파일을 열어야 이 플래그 사용가능

===================================================================================

dwFlagsAndAttributes
 ┣> 파일의 속성을 설정
 ┃
 ┃
 ┣> FILE_ATTRIBUTE_ARCHIVE
 ┃            ┗ 파일의 아카이브비트(파일의 백업 여부) 설정
 ┃
 ┣> FILE_ATTRIBUTE_ENCRYPTED
 ┃            ┗ 파일이나 디렉토리가 암호화 속성을 가짐
 ┃                파일은 데이터가 암호화되고 
 ┃                디렉토리는, 디렉토리안에 새롭게 작성되는 파일이나 서브 디렉토리가 
 ┃                디폴트로 암호화 되며, FILE_ATTRIBUTE_SYSTEM 지정이 되면 적용안됨
 ┃
 ┣> FILE_ATTRIBUTE_HIDDEN
 ┃            ┗ 파일의 숨김 비트 설정
 ┃
 ┣> FILE_ATTRIBUTE_NORMAL
 ┃            ┗ 아무 속성도 가지지 않는 파일, 단독으로 쓰여야 함
 ┃
 ┣> FILE_ATTRIBUTE_OFFLINE
 ┃            ┗ 연결되지 않은 저장 장치에 있어 즉시 사용할 수 없는 파일
 ┃
 ┣> FILE_ATTRIBUTE_READONLY
 ┃            ┗ 파일을 읽기 전용 속성 비트 설정
 ┃
 ┣> FILE_ATTRIBUTE_SYSTEM
 ┃            ┗ 파일이 중요한 시스템 파일임을 나타내는 시스템 비트 설정
 ┃
 ┣> FILE_ATTRIBUTE_TEMPORARY
 ┃            ┗ 임시 저장소에 저장되는 파일, 디스크에 저장이 되지 않고 
 ┃                메모리에 저장되어 연결 속도가 빠르며 사용 후 반드시 삭제해야 함
 ┃
 ┃
 ┃
 ┣> FILE_FLAG_BACKUP_SEMANTICS
 ┃            ┗ 백업이나 복원을 위해 파일이 열리거나 생성 
 ┃
 ┣> FILE_FLAG_DELETE_ON_CLOSE
 ┃            ┗ 핸들이 닫힌 후 파일 삭제
 ┃
 ┣> FILE_FLAG_NO_BUFFERING
 ┃            ┗ 파일이나 디바이스를 데이터의 읽기와 쓰기의 시스템 캐싱 없이 연다
 ┃
 ┣> FILE_FLAG_OPEN_NO_RECALL
 ┃            ┗ 원격 저장 장치에서 사용하는 플래그
 ┃
 ┣> FILE_FLAG_OPEN_REPARSE_POINT
 ┃            ┗ reparse point를 작동시키지 않고 파일을 염
 ┃
 ┣> FILE_FLAG_OVERLAPPED
 ┃            ┗ 파일이나 디바이스 비동기 I/O로 열거나 생성함
 ┃
 ┣> FILE_FLAG_POSIX_SEMANTICS
 ┃            ┗ POSIX 규칙대로 파일을 액세스 함
 ┃                16Bit 윈도우나 MS-DOS에서는 사용할 수 없음
 ┃
 ┣> FILE_FLAG_RANDOM_ACCESS
 ┃            ┗ 임의의 접근 파일임을 나타냄
 ┃
 ┣> FILE_FLAG_SEQUENTIAL_SCAN
 ┃            ┗ 순차적 접근 파일임을 나타냄
 ┃
 ┣> FILE_FLAG_WRITE_THROUGH
 ┃            ┗ 데이터 출력시 캐시를 통하지 않고 곧바로 디스크로 출력
 ┃
 ┃
 ┗> 
단, WINCE에서는 
         FILE_ATTRIBUTE_OFFLINE, FILE_FLAG_OVERLAPPED, FILE_FLAG_NO_BUFFERING, 
         FILE_FLAG_SEQUENTIAL_SCAN, FILE_FLAG_DELETE_ON_CLOSE,
         FILE_FLAG_BACKUP_SEMANTICS, FILE_FLAG_POSIX_SEMANTICS등을 지원하지 않음
         FILE_ATTRIBUTE_TEMPORARY 플래그는 분리된 드라이브나 네트워크 공유 디렉토리를 나타낼때 사용

===================================================================================

hTemplateFile
 ┣> 새로만들고자 하는 파일의 추가 속성을 지원하는 템플릿 파일의 핸들 지정
 ┣> 통상 사용되지 않아서 NULL로 지정하는 게 보통
 ┗>
 WINCE에서는 무시되므로 NULL 설정



참조 : http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx
         윈도우즈 API 정복(김상형 저)
         윈도우 임베디드 CE6.0 프로그래밍(더글라스 볼링 저)












'비공개' 카테고리의 다른 글

TcMalloc lib 적용 시도!!!  (0) 2011.06.27
C++ 0x ( visual studio 2010 적용 )  (0) 2011.06.17
GetLastError() 활용  (0) 2011.05.12
BMW, ‘믿기힘든 연비 운전 기술’ 7가지 공개  (0) 2011.05.09
구조체 와 메모리  (0) 2011.04.27
Posted by 닭꽝