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 = ;
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,
,
,
OPEN_EXISTING,
,
); if (handle != IntPtr.Zero)
return true;
else
return false;
} public unsafe int Read(byte[] buffer, int index, int count)
{
int n = ;
fixed (byte* p = buffer)
{
if (!ReadFile(handle, p + index, count, &n, ))
return ;
}
return n;
} public bool Close()
{
// 关闭文件句柄
return CloseHandle(handle);
}
}
////////////////////////////////////////////////////////////////////下面是测试代码///////////////////////////////////////////////////////////////////////////////
class Test
{
public static int Main(string[] args)
{
if (args.Length != )
{
Console.WriteLine("Usage : ReadFile <FileName>");
return ;
} if (!System.IO.File.Exists(args[]))
{
Console.WriteLine("File " + args[] + " not found.");
return ;
} byte[] buffer = new byte[];
FileReader fr = new FileReader(); if (fr.Open(args[]))
{ // 假定正在读取 ASCII 文件
ASCIIEncoding Encoding = new ASCIIEncoding(); int bytesRead;
do
{
bytesRead = fr.Read(buffer, , buffer.Length);
string content = Encoding.GetString(buffer, , bytesRead);
Console.Write("{0}", content);
}
while (bytesRead > ); fr.Close();
return ;
}
else
{
Console.WriteLine("Failed to open requested file");
return ;
}
}
}
参考链接:
C#通过指针读取文件
C# 指针之美
C#下的指针运用
C#通过指针读取文件的更多相关文章
- Java读取文件的时候,如何让指针重新回到文件的开头
今天在测试IO流的使用的时候发现在reader读取文件之后,再向文件添加内容,再继续读文件,打印出的结果只能读取追加的文件. 如何才能重新读取呢?试了mark和reset,似乎会报异常.记在这以后看是 ...
- php函数fgets读取文件
如果一个文件比较大,可以考虑用fgets函数 下面是个例子: #文件作用:fgets读取文件 $start_time = microtime(true); $file_name = "a.t ...
- Java读取文件的几种方式
package com.mesopotamia.test; import java.io.BufferedReader; import java.io.ByteArrayInputStream; im ...
- LoadRunner 脚本学习 -- 读取文件内容
随便创建个txt文档 输入点内容,例如 读取文件内前N个字符: Action() { long myfile; ; ]; char *filename = "E:\\kkk.txt&quo ...
- 如何有效的使用C#读取文件
如何有效的使用C#读取文件 你平时是怎么读取文件的?使用流读取.是的没错,C#给我们提供了非常强大的类库(又一次吹捧了.NET一番),里面封装了几乎所有我们可以想到的和我们没有想到的类,流是读取文件 ...
- C语言 读取文件中特定数据
//读取文件数据 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> struct jia ...
- Linux C 单链表 读取文件 并排序 实例并解释
C的指针挺头疼的,先看一个例子: 给指针赋值和通过指针进行赋值这两种操作的差别确实让人费解.谨记区分的重要方法是:如果对左操作数进行解引用,则修改的是指针所指对象的值: 如果没有使用解引用操作, ...
- LinuxC语言读取文件,分割字符串,存入链表,放入另一个文件
//file_op.c #include <string.h> #include <stdio.h> #include <stdlib.h> struct info ...
- java读取文件多种方法
1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile { /** * 以字节为单位读取文件,常用 ...
随机推荐
- java 并发(五)---AbstractQueuedSynchronizer(4)
问题 : rwl 的底层实现是什么,应用场景是什么 读写锁 ReentrantReadWriteLock 首先我们来了解一下 ReentrantReadWriteLock 的作用是什么?和 Reent ...
- golang学习之文件上传
首先是上传页面upload.html: <!doctype html> <html> <head> <meta charset="utf-8&quo ...
- 简单测试Java线程安全中阻塞同步与非阻塞同步性能
摘抄自周志明老师的<深入理解Java虚拟机:JVM高级特性与最佳实践>13.2.2 线程安全的实现方法 1.名词解释 同步是指锁哥线程并发访问共享数据时,保证共享数据同一时刻只被一个线程访 ...
- 用图片替代cursor光标样式
鼠标光标样式有限,可参考http://css-cursor.techstream.org/,自定义光标样式可用设置cursor:url('xxx.cur'),auto;.还有一种办法,就是用图片替代鼠 ...
- php注册
<?php var_dump($_GET);//打印出对象的数据类型//链接数据库$link = @mysql_connect('localhost','root','root');#选择数据库 ...
- XPath路径表达式笔记(转载)
简单说,xpath就是选择XML文件中节点的方法. 所谓节点(node),就是XML文件的最小构成单位,一共分成7种. - element(元素节点)- attribute(属性节点)- text ( ...
- 139.00.007 Git学习-Cheat Sheet
@(139 - Environment Settings | 环境配置) Git虽然极其强大,命令繁多,但常用的就那么十来个,掌握好这十几个常用命令,你已经可以得心应手地使用Git了. 友情附赠国外网 ...
- TextSwitcher(文本切换器)和ViewFlipper
1.TextSwitcher 使用: 应用分为三步: 1.得到 TextSwitcher 实例对象 TextSwitcher switcher = (TextSwitcher) findViewB ...
- 面试准备之三Django知识
Django请求流程 MTV模式 路由 视图 ORM 模板
- QT5.3 杂记
Qt5下,QWidget系列从QtGui中被剥离出去,成为单独的QtWidget模块.随着Qt Quick2的引入,QtDeclarative也逐渐和QWidget系列也脱离关系. 最终:在Qt5下的 ...