ISO文件格式被很多虚拟光驱软件和刻录软件支持,比较典型的有WinISO ,Alcohol 120%这些软件.有的时候需要自己制作一个ISO文件的话,则需要找专门的工具;其实要做一个ISO的文件可以很简单,就是把光盘的所有数据映射到文件,只要你可以读光盘的数据就可以生成它.但是,它不是单纯的把光盘上的文件都读入,而是要把整个磁盘信息读入,那么你必须访问磁盘数据,而不是文件;

在WINDOWS下读取磁盘的方法很简单,按该方法也可以读取引导区信息;具体如下:

CreateFile("\\\\.\\"+driverName, GENERIC_READ, FILE_SHARE_READ, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);

在.net 下,要作到这种模式的访问,使用FileStream可行不通,程序运行的时候会直接报个异常,阻止你访问Win32 设备磁盘.那么只能使用原始的做法,声明API.通过SafeFileHandle将文件句柄传递给托管的流进行读写操作.具体做法如下:

使用 SafeFileHandle 类和非托管 CreateFile 函数打开 Win32 设备
1/**//// <summary>
2/// 使用 SafeFileHandle 类和非托管 CreateFile 函数打开 Win32 设备
3/// </summary>
4class UnmanagedDriverLoader
5{
6public const short FILE_ATTRIBUTE_NORMAL = 0x80;
7public const short INVALID_HANDLE_VALUE = -1;
8public const uint GENERIC_READ = 0x80000000;
9public const uint GENERIC_WRITE = 0x40000000;
10public const uint FILE_SHARE_READ = 0x00000001;
11public const uint CREATE_NEW = 1;
12public const uint CREATE_ALWAYS = 2;
13public const uint OPEN_EXISTING = 3;
14
15 [DllImport("kernel32.dll", SetLastError = true)]
16static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess,
17uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition,
18uint dwFlagsAndAttributes, IntPtr hTemplateFile);
19
20private SafeFileHandle handleValue = null;
21
22public UnmanagedDriverLoader(string driverName)
23{
24 Load(driverName);
25 }
26
27public void Load(string driverName)
28{
29if (driverName == null && driverName.Length == 0)
30{
31throw new ArgumentNullException("driverName");
32 }
33
34 handleValue = CreateFile("\\\\.\\"+driverName, GENERIC_READ, FILE_SHARE_READ, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
35
36if (handleValue.IsInvalid)
37{
38 Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error());
39 }
40 }
41
42public SafeFileHandle Handle
43{
44get
45{
46if (!handleValue.IsInvalid)
47{
48return handleValue;
49 }
50else
51{
52return null;
53 }
54 }
55 }
56 }

有了SafeFileHandle 之后,就可以使用FileStream 流来对其操作了;

首先确定磁盘的大小,再建立一个缓冲区,和一个目标文件用于写入;我建立的缓冲区是10兆,因为光驱比较快,内存也够用。

/**////10兆一个块
int bufferSize = 10240;
byte[] buffer = new byte[bufferSize];

剩下的事情就简单多了;只需要按块读入,并写到目标文件内:

/**////计算块的分页大小
long icount = (long)(GetCDROMSize(driverName) / bufferSize);
if ((GetCDROMSize(driverName) % bufferSize) != 0)
icount++;
long length = bufferSize;

hDriver.Seek(0, SeekOrigin.Begin);
hIso.Seek(0, SeekOrigin.Begin);

/**////遍历块写到文件
for (long i = 0; i < icount; i++)
{
hDriver.Read(buffer, 0, (int)length);
hIso.Write(buffer, 0, (int)length);

length = GetCDROMSize(driverName) - hDriver.Position;

if (OnProgress != null)
{
OnProgress(this, 0, GetCDROMSize(driverName), hIso.Length);
}
if (length > bufferSize)
length = bufferSize;
}

hDriver.Close();
hIso.Close();

OK,一个磁盘的镜像文件就建立好了,那么可以试试用 WinRar 或 Daemon Tools 装入试试;一切很正常。

根据以上的代码,我作了个DEMO,用于对光盘创建ISO镜像.一样很简单,可以先看看界面.

本文转自suifei博客园博客,原文链接:http://www.cnblogs.com/Chinasf/archive/2006/04/29/388658.html,如需转载请自行联系原作者

.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO相关推荐

  1. linux光盘镜像文件在哪,linux下如何读取使用iso 镜像文件的方法

    如果拷贝到本地,可以使用mount mount fileName mountPoint -o loop,fileName是镜像文件名(*.iso,*.img), 用例:如我有一个/home/rhel5 ...

  2. 在linux系统下挂接(mount)光盘镜像文件、移动硬盘、U盘以及Windows网络共享和UNIX...

    挂接命令(mount) 命令格式: mount [-t vfstype] [-o options] device dir 其中: 1.-t vfstype指定文件系统的类型,通常不必指定.mount会 ...

  3. php二维码存放json数据_PHP生成及获取JSON文件的方法

    本文实例讲述了PHP生成及获取JSON文件的方法.分享给大家供大家参考,具体如下: 首先定义一个数组,然后遍历数据表,把相应的数据放到数组中,最后通过json_encode()转化数组 json_en ...

  4. (YOLOv3训练超详细教程)在Ubuntu 18.04下使用YOLOv3训练数据(提供源码及文件夹)

    一.环境 Ubuntu 18.04 + CUDA10.0 +CUDNN 下方是我训练时的真实文件,可供大家参考 大家需要我的文件资源的请使用曲奇云盘下载,下面是下载链接:https://quqi.gb ...

  5. php excel 模板,PHP以Excel模板填充数据并生成新的Excel文件

    遇到这个一个问题,需要生成带水印的Excel文件,具体思路如下:先设置一个调好格式的Excel文件作为模板,再用PHP以模板文件填充,并生成新的Excel文件,这样新的文件就和模板文件格式一致.程序用 ...

  6. linux dd目录生成iso文件,Linux下dd + mkisofs 制作可启动 img/iso 映像文件

    总的来说,制作镜像文件有三种方法,cp, cat, dd 和其它专用工具.cp ,cat 和 dd都可以从设备复制文件来创建镜像.而 dd 命令更为强大,可以通过指定块大小,块多少来直接创建镜像. I ...

  7. 命令行下(bat)使用 Lhaplus 自动 压缩 解压文件 (含参数设定说明)

    命令行下(bat)使用 Lhaplus 自动 压缩 解压文件,参数设定 https://mp.csdn.net/console/editor/html/104400832 ■前言 准备测试数据,要压缩 ...

  8. 从MySql 数据库中导出数据并生成指定格式xml文件

    最近网站需要做数据迁移,需要我将网站的数据从mysql数据库中导出,并按照要求生成指定格式的xml文件. xml格式要求: 代码: package com.epsoft.gjjisp;import j ...

  9. c++语言读txt数据,关于C++中读取txt文件中字符串 - 程序语言 - 小木虫 - 学术 科研 互动社区...

    #include<iostream> #include<fstream> #include<string> #include<vector> using ...

最新文章

  1. keepalived+nginx安装与配置
  2. 计算机视觉:让冰冷的机器看懂这个多彩的世界
  3. Windows服务器版本简介
  4. ITK:双边过滤图像
  5. 解决vue router使用 history 模式刷新后404问题
  6. xfce中鼠标的“反转卷轴方向“
  7. php进阶面向对象及tp5,TP5实战技巧---开发思路 引路造桥
  8. 令人迷惑的硬币翻转(洛谷P1146题题解,Java语言描述)
  9. js 指定年月获取最后天
  10. DCM4CHEE 中worklist 乱码问题 dcmchee 中文乱码
  11. 科学计算机imissyou,imissyou是什么意?imissyou – 手机爱问
  12. 新装Kubuntu 18.04后的一些操作
  13. 洛谷P1359 租用游艇
  14. ROS下利用realsense采集RGBD图像合成点云
  15. html点击按钮跳出消息框
  16. 《策略驱动型数据中心——ACI技术详解》——1.3 数据中心设计
  17. The run destination iPhone is not valid for running the scheme “xx”
  18. 《最强大脑第九季》C#手撸傅立叶残影题目
  19. 【德诚视觉你值得拥有】
  20. 流氓软件终结者:Windows Defender

热门文章

  1. React 组件之间 事件调用(父组件调用子组件)
  2. Atitit. 查找linux 项目源码位置
  3. OC基础-关于构造方法
  4. PHP特级课视频教程_第二十八集 PHP搜索代码测试_李强强
  5. FilteredTextBoxExtender
  6. WebClient.UploadValues Post中文乱码的解决方法
  7. 用python爬取一个人所有信息_python实战===爬取所有微信好友的信息
  8. 计算某个时间距离现在_计算成像amp;深度学习(1)
  9. pdf批量添加图章_关于添加图章,过来人有哪些实用经验
  10. intellij gradle java_Java 使用 IntelliJ IDEA Gradle创建新项目报错问题解决方法