欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#通过指针读取文件的方法

程序员文章站 2023-12-04 17:31:34
本文实例讲述了c#通过指针读取文件的方法。分享给大家供大家参考。具体如下: // readfile.cs // 编译时使用:/unsafe // 参数:rea...

本文实例讲述了c#通过指针读取文件的方法。分享给大家供大家参考。具体如下:

// readfile.cs
// 编译时使用:/unsafe
// 参数:readfile.txt
// 使用该程序读并显示文本文件。
using system;
using system.runtime.interopservices;
using system.text;
class filereader
{
  const uint generic_read = 0x80000000;
  const uint open_existing = 3;
  intptr handle;
  [dllimport("kernel32", setlasterror=true)]
  static extern unsafe intptr createfile(
    string filename,        // 文件名
    uint desiredaccess,        // 访问模式
    uint sharemode,          // 共享模式
    uint securityattributes,    // 安全属性
    uint creationdisposition,    // 如何创建
    uint flagsandattributes,    // 文件属性
    int htemplatefile        // 模板文件的句柄
    );
  [dllimport("kernel32", setlasterror=true)]
  static extern unsafe bool readfile(
    intptr hfile,          // 文件句柄
    void* pbuffer,        // 数据缓冲区
    int numberofbytestoread,  // 要读取的字节数
    int* pnumberofbytesread,    // 已读取的字节数
    int overlapped        // 重叠缓冲区
    );
  [dllimport("kernel32", setlasterror=true)]
  static extern unsafe bool closehandle(
    intptr hobject // 对象句柄
    );
  public bool open(string filename)
  {
    // 打开现有文件进行读取
    handle = createfile(
      filename,
      generic_read,
      0, 
      0, 
      open_existing,
      0,
      0);
    if (handle != intptr.zero)
      return true;
    else
      return false;
  }
  public unsafe int read(byte[] buffer, int index, int count) 
  {
    int n = 0;
    fixed (byte* p = buffer) 
    {
      if (!readfile(handle, p + index, count, &n, 0))
        return 0;
    }
    return n;
  }
  public bool close()
  {
    // 关闭文件句柄
    return closehandle(handle);
  }
}
class test
{
  public static int main(string[] args)
  {
    if (args.length != 1)
    {
      console.writeline("usage : readfile <filename>");
      return 1;
    }
    if (! system.io.file.exists(args[0]))
    {
      console.writeline("file " + args[0] + " not found."); 
      return 1;
    }
    byte[] buffer = new byte[128];
    filereader fr = new filereader();
    if (fr.open(args[0]))
    {
      // 假定正在读取 ascii 文件
      asciiencoding encoding = new asciiencoding();
      int bytesread;
      do 
      {
        bytesread = fr.read(buffer, 0, buffer.length);
        string content = encoding.getstring(buffer,0,bytesread);
        console.write("{0}", content);
      }
      while ( bytesread > 0);
      fr.close();
      return 0;
    }
    else
    {
      console.writeline("failed to open requested file");
      return 1;
    }
  }
}

希望本文所述对大家的c#程序设计有所帮助。