首页 > 编程 > C# > 正文

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

2020-01-24 01:40:33
字体:
来源:转载
供稿:网友

本文实例讲述了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#程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表