当前位置: 首页 > news >正文

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#下的指针运用

相关文章:

  • C# 基础数据与Byte
  • mysql 分页sql
  • SQL Server 2008数据库邮件配置及应用
  • vim 强大复制链接
  • nginx+fpm报499错误的解决方案
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • Linux curl命令
  • 程序员眼中的英文单词是这样的
  • VMware Horizon view打印机出现多个副本
  • 十年工作总结(一)
  • window下安装scala步骤
  • XenServer体系架构解析
  • RFC2889转发性能測试用例设计和自己主动化脚本实现
  • 探秘Java虚拟机——内存管理与垃圾回收(转)
  • 我的运维之路
  • 【个人向】《HTTP图解》阅后小结
  • 【前端学习】-粗谈选择器
  • Angular 响应式表单之下拉框
  • canvas 高仿 Apple Watch 表盘
  • Mocha测试初探
  • Redis在Web项目中的应用与实践
  • webpack入门学习手记(二)
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 大型网站性能监测、分析与优化常见问题QA
  • 两列自适应布局方案整理
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 前端代码风格自动化系列(二)之Commitlint
  • 设计模式 开闭原则
  • 使用权重正则化较少模型过拟合
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 一个JAVA程序员成长之路分享
  • #Java第九次作业--输入输出流和文件操作
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • $NOIp2018$劝退记
  • (02)vite环境变量配置
  • (12)Linux 常见的三种进程状态
  • (NSDate) 时间 (time )比较
  • (poj1.3.2)1791(构造法模拟)
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (八)Flask之app.route装饰器函数的参数
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (二)fiber的基本认识
  • (六)激光线扫描-三维重建
  • (四)JPA - JQPL 实现增删改查
  • (四)汇编语言——简单程序
  • (未解决)macOS matplotlib 中文是方框
  • (转)程序员技术练级攻略
  • (转载)Google Chrome调试JS
  • ../depcomp: line 571: exec: g++: not found
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件