Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 윈도데브
- UX베이커리
- 거제도
- 소년포비
- 쉐어포인트코리아
- 훈스닷넷
- 헤이맨
- 주신영
- 신동혁
- 윈도우폰7
- 서진호
- 신석현
- 황광진
- winmodev
- 데브피아
- 윈도우모바일
- 실버라이트 코리아
- 마이크로소프트
- 윈모데브
- 김춘배
- 옴니아2
- 스마트폰
- MIX10
- 안드로이드
- 루나네스
- 윈도우 모바일
- 윈도우폰
- 지승욱
- windows mobile 6.5
- 소년포비소프트
Archives
- Today
- Total
소년포비의 세계정복!!
[C#] WIN32 API를 이용 본문
원문 링크 : http://kkommy.com/1170255989
C#에서 WIN32 API를 이용하는 방법을 알아본다.
* 기본적으로 DllImport를 이용하여 해당 DLL을 직접 import해서 사용해야 한다.
* 사용할 API에 대해서는 API관련 문서를 참고하도록 한다.
* 아래는 WIN32 API를 이용하여 파일을 열어서 읽고 닫는 클래스이다.
* StreamReader와의 속도면에서 큰 차이가 없으나, 파일을 열때 추가적인 속성 등을 결정할 수 있는 장점이 있다.
* 사용할 API에 대해서는 API관련 문서를 참고하도록 한다.
* 아래는 WIN32 API를 이용하여 파일을 열어서 읽고 닫는 클래스이다.
* StreamReader와의 속도면에서 큰 차이가 없으나, 파일을 열때 추가적인 속성 등을 결정할 수 있는 장점이 있다.
빌드시 유의점
* VS.Net 2003의 C#에서 포인터를 사용하는 Win API를 이용하려고 하는 경우 컴파일되지 않는다.
* 프로젝트의 구성 페이지 > 구성속성 > 빌드 > 코드생성 > 안전하지 않은 코드 블록 허용 => true로 변경 후에 컴파일 해야한다.
* 프로젝트의 구성 페이지 > 구성속성 > 빌드 > 코드생성 > 안전하지 않은 코드 블록 허용 => 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.
}
'프로그램 세상 > C#' 카테고리의 다른 글
[C#] 외부 응용프로그램 실행 (0) | 2009.10.22 |
---|---|
[C#] 세가지 Timer 와 그 차이점 (0) | 2009.10.14 |
[C#] 전광판처럼 움직이는 라벨 (0) | 2009.10.13 |
[C#] DB에 이미지저장하고 불러오기 (0) | 2009.10.12 |
[c#] 모든 드라이브 정보 얻기? (0) | 2009.10.11 |