下面是示例在C#里面调用win32api中的 CreateFile 和 CloseHandle 这两个函数。
using System;
using System.IO;
using System.Runtime.InteropServices;
namespace copytest
{
/// <summary>
/// FileAccess 的摘要说明。
/// </summary>
public class OpenFileApi
{
private const uint GENERIC_READ = 0x80000000;
private const uint GENERIC_WRITE = 0x40000000;
private const int CREATE_NEW = 1;
private const int CREATE_ALWAYS = 2;
private const int OPEN_EXISTING = 3;
private const int OPEN_ALWAYS = 4;
private const int FILE_SHARE_READ = 0x1;
private const int FILE_SHARE_WRITE = 0x2;
private const uint FILE_ATTRIBUTE_READONLY = 0x1;
private const uint FILE_ATTRIBUTE_HIDDEN = 0x2;
private const uint FILE_ATTRIBUTE_SYSTEM = 0x4;
private const uint FILE_ATTRIBUTE_DIRECTORY = 0x10;
private const uint FILE_ATTRIBUTE_ARCHIVE = 0x20;
private const uint FILE_ATTRIBUTE_NORMAL = 0x80;
private const uint FILE_ATTRIBUTE_TEMPORARY = 0x100;
private const uint FILE_ATTRIBUTE_COMPRESSED = 0x800;
private const uint FILE_FLAG_NO_BUFFERING = 0x20000000;
private const uint FILE_FLAG_WRITE_THROUGH = 0x80000000;
private const int INVALID_HANDLE_VALUE = -1;
private int filehandle;
//声明API的语句。(关键!)
[DllImport("kernel32.dll")]
private static extern int CreateFile
(
string lpFileName, //File name
uint dwDesiredAccess, //Access mode
int dwShareMode, //Share mode
int lpSecurityAttributes, //SD
int dwCreationDisposition, //How to create
uint dwFlagsAndAttributes, //File attributes
int hTemplateFile //Handle to template file
);
[DllImport("kernel32.dll")]
private static extern bool CloseHandle
(
int hObject //Handle to object
);
public OpenFileApi()
{
filehandle=INVALID_HANDLE_VALUE;
nobuffermode=false;
}
~OpenFileApi()
{
Close();
}
public FileStream Open(String filepath,FileMode mode, FileAccess access,FileShare share)
{
uint dwDesiredAccess; //Access mode
int dwShareMode; //Share mode
int lpSecurityAttributes; //SD
int dwCreationDisposition; //How to create
uint dwFlagsAndAttributes; //File attributes
if (filehandle != INVALID_HANDLE_VALUE)
{
CloseHandle(filehandle);
}
switch (access)
{
case FileAccess.Read:
dwDesiredAccess=GENERIC_READ;
break;
case FileAccess.Write:
dwDesiredAccess=GENERIC_WRITE;
break;
default:
dwDesiredAccess=GENERIC_READ | GENERIC_WRITE;
break;
}
switch (share)
{
case FileShare.Read:
dwShareMode=FILE_SHARE_READ;
break;
case FileShare.Write:
dwShareMode=FILE_SHARE_WRITE;
break;
case FileShare.ReadWrite:
dwShareMode=FILE_SHARE_READ | FILE_SHARE_WRITE;
break;
default:
dwShareMode=0;
break;
}
switch (mode)
{
case FileMode.Open:
dwCreationDisposition=OPEN_EXISTING;
break;
case FileMode.OpenOrCreate:
dwCreationDisposition=OPEN_ALWAYS;
break;
case FileMode.CreateNew:
dwCreationDisposition=CREATE_NEW;
break;
default:
dwCreationDisposition=CREATE_ALWAYS;
break;
}
lpSecurityAttributes=0;
dwFlagsAndAttributes=FILE_ATTRIBUTE_NORMAL;
filehandle=CreateFile(filepath,
dwDesiredAccess,
dwShareMode,
lpSecurityAttributes,
dwCreationDisposition,
dwFlagsAndAttributes,
0);
if (filehandle != INVALID_HANDLE_VALUE)
{
FileStream newfs = new FileStream((IntPtr)filehandle,access);
return(newfs);
}
else
{
throw new Exception("File cannot open.");
//return(null);
}
}
public void Close()
{
if (filehandle!=INVALID_HANDLE_VALUE)
{
CloseHandle(filehandle);
filehandle=INVALID_HANDLE_VALUE;
}
}
}
}