반응형

원문 링크 : 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.}
반응형

+ Recent posts