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

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

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

.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOCreateFile("\\\\.\\"+driverName, GENERIC_READ, FILE_SHARE_READ, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);

在.net 下,要作到这种模式的访问,使用FileStream可行不通,程序运行的时候会直接报个异常,阻止你访问Win32 设备磁盘.那么只能使用原始的做法,声明API.通过SafeFileHandle将文件句柄传递给托管的流进行读写操作.具体做法如下:
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO使用 SafeFileHandle 类和非托管 CreateFile 函数打开 Win32 设备
1.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO/**//// <summary>
2.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO/// 使用 SafeFileHandle 类和非托管 CreateFile 函数打开 Win32 设备
3.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO/// </summary>

4.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOclass UnmanagedDriverLoader
5.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO{
6.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOpublic const short FILE_ATTRIBUTE_NORMAL = 0x80;
7.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOpublic const short INVALID_HANDLE_VALUE = -1;
8.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOpublic const uint GENERIC_READ = 0x80000000;
9.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOpublic const uint GENERIC_WRITE = 0x40000000;
10.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOpublic const uint FILE_SHARE_READ = 0x00000001;
11.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOpublic const uint CREATE_NEW = 1;
12.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOpublic const uint CREATE_ALWAYS = 2;
13.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOpublic const uint OPEN_EXISTING = 3;
14.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO
15.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO [DllImport("kernel32.dll", SetLastError = true)]
16.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOstatic extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess,
17.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOuint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition,
18.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOuint dwFlagsAndAttributes, IntPtr hTemplateFile);
19.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO
20.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOprivate SafeFileHandle handleValue = null;
21.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO
22.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOpublic UnmanagedDriverLoader(string driverName)
23.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO{
24.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO Load(driverName);
25.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO }

26.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO
27.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOpublic void Load(string driverName)
28.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO{
29.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOif (driverName == null && driverName.Length == 0)
30.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO{
31.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOthrow new ArgumentNullException("driverName");
32.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO }

33.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO
34.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO handleValue = CreateFile("\\\\.\\"+driverName, GENERIC_READ, FILE_SHARE_READ, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
35.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO
36.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOif (handleValue.IsInvalid)
37.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO{
38.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error());
39.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO }

40.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO }

41.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO
42.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOpublic SafeFileHandle Handle
43.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO{
44.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOget
45.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO{
46.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOif (!handleValue.IsInvalid)
47.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO{
48.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOreturn handleValue;
49.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO }

50.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOelse
51.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO{
52.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOreturn null;
53.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO }

54.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO }

55.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO }

56.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO }
有了SafeFileHandle 之后,就可以使用FileStream 流来对其操作了;

首先确定磁盘的大小,再建立一个缓冲区,和一个目标文件用于写入;我建立的缓冲区是10兆,因为光驱比较快,内存也够用。
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO/**////10兆一个块
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOint bufferSize = 10240;
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMObyte[] buffer = new byte[bufferSize];

剩下的事情就简单多了;只需要按块读入,并写到目标文件内:
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO/**////计算块的分页大小
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOlong icount = (long)(GetCDROMSize(driverName) / bufferSize);
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOif ((GetCDROMSize(driverName) % bufferSize) != 0)
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO icount++;
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOlong length = bufferSize;
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO hDriver.Seek(0, SeekOrigin.Begin);
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO hIso.Seek(0, SeekOrigin.Begin);
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO/**////遍历块写到文件
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOfor (long i = 0; i < icount; i++)
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO{
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO hDriver.Read(buffer, 0, (int)length);
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO hIso.Write(buffer, 0, (int)length);
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO length = GetCDROMSize(driverName) - hDriver.Position;
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOif (OnProgress != null)
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO{
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO OnProgress(this, 0, GetCDROMSize(driverName), hIso.Length);
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO }

.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMOif (length > bufferSize)
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO length = bufferSize;
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO }

.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO hDriver.Close();
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO hIso.Close();

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

根据以上的代码,我作了个DEMO,用于对光盘创建ISO镜像.一样很简单,可以先看看界面.
.net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO



本文转自suifei博客园博客,原文链接:http://www.cnblogs.com/Chinasf/archive/2006/04/29/388658.html,如需转载请自行联系原作者
上一篇:Spring MVC系列教材 (六)- SPRING MVC 如何使用Session


下一篇:初步ecs使用体验