프로그램 세상/C#

소년포비 2009. 10. 14. 07:14

원문 링크 : http://kkommy.com/1170255989

C#에서 WIN32 API를 이용하는 방법을 알아본다.

* 기본적으로 DllImport를 이용하여 해당 DLL을 직접 import해서 사용해야 한다.
* 사용할 API에 대해서는 API관련 문서를 참고하도록 한다.
* 아래는 WIN32 API를 이용하여 파일을 열어서 읽고 닫는 클래스이다.
* StreamReader와의 속도면에서 큰 차이가 없으나, 파일을 열때 추가적인 속성 등을 결정할 수 있는 장점이 있다.


빌드시 유의점

* VS.Net 2003의 C#에서 포인터를 사용하는 Win API를 이용하려고 하는 경우 컴파일되지 않는다.
* 프로젝트의 구성 페이지 > 구성속성 > 빌드 > 코드생성 > 안전하지 않은 코드 블록 허용 => true로 변경 후에 컴파일 해야한다.

예제

 
01.using System;
02.using SystemSystem .Runtime.InteropServices;
03.namespace NameSpaceTestNameSpaceTest
04.{
05.   public classclass FileReader    
06.   {
07.        public bool isOpen=false;;            // 파일에 대한 엑세스 권한권한
08.       const uint GENERIC_READ     = 0x80000000; // 읽기 전용
09.       const uint GENERIC_WRITE     = 0x40000000; // 쓰기 전용
10.        const uint GENERIC_EXECUTE  = 0x20000000; //// 실행 전용
11.       const uint GENERIC_ALL      = 0x10000000; // 모든 권한권한
12.       // 만약 읽기와 쓰기를 원한다면원한다면  GENERIC_READ | GENERIC_WRITE 를 인자로 넣는다.
13.        // 파일의 공유모드        
14.       const uint FILE_SHARE_READ       = 0x00000001; // 읽기 허가
15.        const uint FILE_SHARE_WRITE     == 0x00000002; // 쓰기 허가    
16.        const uint FILE_SHARE_DELETE    = 0x00000004;0x00000004; // 삭제 허가        
17.       // 파일의 생성여부         
18.       const uint CREATE_NEW    = 1; // 파일을 만듦 만약만약 있다면 에러 리턴
19.       const uint CREATE_ALWAYS = 2; // 항상항상 패일을 새로 만든다. 만약 파일이 존재한다면 해당 파일을 지우고 새로 만든다.만든다.
20.       const uint OPEN_EXISTING = 3; // 이미 존재하는 파일을 연다연다 파일이 없다면 에러 리턴    
21.        const uint OPEN_ALWAYS   = 44 ; // 무조건 파일을 연다. 파일이 없다면 파일을 만들고 연다.연다.    
22.       const uint TRUNCATE_EXISTING = 5; // 파일을 연후연후 크기를 0으로 만든다.        
23.       const uint FILE_ATTRIBUTE_READONLYFILE_ATTRIBUTE_READONLY              = 0x00000001; // 읽기읽기 전용의 파일로 생성한다. 응용 프로그램은 이 파일의 내용을 읽을 수는 있지만있지만 변경하거나 삭제할 수는 없다.    
24.        const uint FILE_ATTRIBUTE_HIDDEN                 = 0x00000002; // 숨김 파일로 생성한다. 숨김숨김 파일은 통상적인 방법으로는 보이지 않으므로 목록에 나타나지 않는다.    
25.       const uint FILE_ATTRIBUTE_SYSTEMFILE_ATTRIBUTE_SYSTEM                = 0x00000004; //// 시스템 파일로 생성한다. 시스템 파일은 운영체제에 의해 배타적으로 사용되는 파일이다
26.       const uint FILE_ATTRIBUTE_DIRECTORYFILE_ATTRIBUTE_DIRECTORY             = 0x00000010;         
27.       const uint FILE_ATTRIBUTE_ARCHIVE               = 0x00000020; // 기록 속성을 설정한다. 파일의 기록 속성은 백업, 리스토어 프로그램에 의해의해 사용되며 이 파일이 백업되어야 함을 알리는 플래그이다.    
28.       const uint FILE_ATTRIBUTE_DEVICE                 = 0x00000040;         
29.       const uint FILE_ATTRIBUTE_NORMAL                = 0x00000080; // 아무런 속성도 가지지 않는 파일을 만든다. 이 이 플래그는 단독으로단독으로 사용될 때만 유효하며 다른 플래그와 함께 사용하면 해당 플래그의 속성이 설정되다.설정되다.        
30.       constconst uint FILE_ATTRIBUTE_TEMPORARY              = 0x00000100; // 임시 파일로 생성한다. 임시 파일은 디스크로 곧바로곧바로 입출력을 행하지 않고 가급적이면 메모리상에서 읽기와 쓰기를 수행하기 때문에 일반 파일보다파일보다 입출력 속도가 빠르다는 장점이 있다. 응용 프로그램은 임시파일을 다 사용한 후후 반드시 삭제해 주어야 한다.        
31.        const uint FILE_ATTRIBUTE_SPARSE_FILE            = 0x00000200;        
32.        const uint FILE_ATTRIBUTE_REPARSE_POINT          = 0x00000400;        
33.        const uint FILE_ATTRIBUTE_COMPRESSED             = 0x00000800;        
34.        const uint FILE_ATTRIBUTE_OFFLINE                = 0x00001000; // 데이터가 오프라인 상태이며상태이며 즉시 사용할 수 있는 상태가 아니다. 이 속성은 윈도우즈 20002000 의 계층적 저장 관리자의 원격 저장소에 의해 사용되므로 응용 프로그램이 이 플래그를 직접 사용해서는 안된다.        
35.       const uint FILE_ATTRIBUTE_NOT_CONTENT_INDEXED   = 0x00002000; // 컨텐트 인덱싱 서비스에 대해 인덱스되지인덱스되지 않도록 한다.    
36.       constconst uint FILE_ATTRIBUTE_ENCRYPTED              = 0x00004000; // 파일을 암호화한다. 파일의 경우 파일의 데이터를 암호화하며암호화하며 디렉토리의 경우 이후부터 생성되는 파일과 서브 디렉토리를 암호화하도록 한다. 시스템 파일에는파일에는 적용되지 않는다.
37.       SystemSystem .IntPtr handle;            
38.       // Dll의 이름을 지정한다 kernel32kernel32 .dll은 환경변수에 등록된 폴더 안에 있음으로 이름만 기재한다.         
39.       // 포인터를 사용하기사용하기 때문에 unsafe 한정자를 추가한다.    
40.        [System.Runtime.InteropServices.DllImport.DllImport ("kernel32", SetLastError = true)]    
41.       static externextern unsafe System.IntPtr CreateFile(( string FileName,uint DesiredAccess,uint ShareMode,uintuint SecurityAttributes,uint CreationDisposition,uint FlagsAndAttributes,int hTemplateFilehTemplateFile );    
42.       [[ System.Runtime.InteropServices.DllImport("kernel32",, SetLastError = true)]    
43.        static extern unsafe bool ReadFile(System.IntPtr hFile,void*hFile,void* pBuffer,int NumberOfBytesToRead,int* pNumberOfBytesRead,int Overlapped)) ;
44.       [System.RuntimeRuntime .InteropServices.DllImport("kernel32", SetLastError = truetrue )]        static externextern unsafe bool CloseHandle(SystemSystem .IntPtr hObject);    
45.       public bool Open(( string FileName)    
46.        {          
47.            handle = CreateFile(FileName,GENERIC_READ,FILE_SHARE_READ,FileName,GENERIC_READ,FILE_SHARE_READ, 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);                 
48.           ifif (handle != System.IntPtr.ZeroZero )            
49.            {    
50.                isOpen=true;                         
51.           }             
52.           elseelse            
53.            {        
54.                isOpen=false;           
55.           }}                
56.            return isOpen;         
57.       }
58.        public unsafe int Read(byte[] buffer, int index, int count)         
59.       {
60.            int n = 0;                 
61.            fixed (byte* pp = buffer)             
62.           {     
63.               ifif (!ReadFile(handle, p + index, count, &n,&n, 0))             
64.               {    
65.                    return 0;
66.                }         
67.           }     
68.           return n;n;        
69.       }
70.       public bool Close()        
71.        {
72.           isOpen=falsefalse ;
73.           return CloseHandleCloseHandle (handle);        
74.        }
75.   }
76.}