C#通过指针读取文件

复制代码
// readfile.cs
// 编译时使用:/unsafe
// 参数:readfile.txt

// C#通过指针读取文件。使用该程序读并显示文本文件。
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#通过指针读取文件

C# 指针之美

C#下的指针运用

posted @   rainbow70626  阅读(2848)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示