磁盘格式化的编程实现

转载 2004年08月06日 16:20:00

磁盘格式化是计算机用户经常使用的操作之一,但由于操作系统的控制台和外壳(Shell)提供了对格式化的完美支持,使编程人员很容易忽视用户对格式化的基本需求。在他们看来,磁盘格式化对用户来说并不是一个太大的问题,应用程序不必要对它提供支持。其实,这是一个错觉,当用户在运行应用程序遇到需要格式化磁盘时,再切换到控制台或者资源管理器去格式化磁盘是非常不便和烦琐的。 

还有一部分编程人员认为磁盘格式化很容易实现,没有技术障碍,因此没有赋予足够重视。其实,在实际编程时笔者发现磁盘格式化是一个不大不小的问题。一方面,它要求编程尽量简单,不要涉及中断、端口读写、物理扇区存取、VXD、WDM驱动程序等复杂细节,只要能实现格式化即可,代码越简单越好,最好是只调用一个函数即可实现。另一方面,笔者却发现,基本上所有的编程参考书籍都对这个问题只字不提,在MSDN中也很难找到一个具有这样功能的FormatDisk函数。当然,我们可以利用WinExec、CreateProcess和ShellExecute等函数去执行Format命令,并且这方案完全可行,不过随之产生的控制台窗口会使我们的窗口程序显得不伦不类,破坏原有的程序界面。虽然我们还可以通过设置CreateProcess函数的参数实现对控制台窗口的隐藏,使Format.exe隐蔽地在后台运行,但这又需要我们维护它的完整路径,这也存在一定困难。 

主要函数 

从实际应用的角度看,从Windows 9X到Windows NT都应该提供这个FormatDisk函数,否则怎么实现资源管理器窗口的磁盘格式化呢?笔者通过仔细查找发现,Windows 确实提供了这样一个函数,尽管文档资料没有注明,但是如果我们使用View Dependencies打开Shell2.dll,就会发现这个函数。它就是SHFormatDrive,编译连接到Shell32.lib。尽管通过平台的SDK文档和SHELLAPI.H文件并不能发现这个函数,但是Win32各个操作系统都能找到它的踪影。应用程序可以通过调用这个函数实现借用外壳的磁盘格式化对话框格式化磁盘。调用约定如下: 

DWORD WINAPI SHFormatDrive(HWND hwnd,UINT drive,UINT fmtID,UINT options); 

参数含义如下: 

hwnd:拥有对话框的窗口句柄,注意hwnd为NULL时,并不会导致这个对话框生成一个上层的应用程序,也就是说,这个参数总是非NULL,这个对话框只能作为一个窗口的子窗口,而不能作为一个单独的应用程序; 

drive:要格式化的驱动器号,以A: == 0为基准,依此类推; 

fmtID:必须设定为 SHFMT_ID_DEFAULT,即0xFFFF; 

options:可以有两个选择项:SHFMT_OPT_FULL 0x0001和SHFMT_OPT_SYSONLY 0x0002,如果这一项设置为零,系统就要使用快速格式化作为默认设置。 

该函数的返回值要么为一个下列以SHFMT_开头的值,要么是一个成功格式化的磁盘标识。 

//上次格式化出错,磁盘可能被格式化 

#define SHFMT_ERROR 0xFFFFFFFFL 

//格式化被取消 

#define SHFMT_CANCEL 0xFFFFFFFEL 

// 不能进行磁盘格式化 

#define SHFMT_NOFORMAT 0xFFFFFFFDL 

实现步骤 

1.函数接口声明 

typedef DWORD (WINAPI *PFNSHFORMATDRIVE)(HWND hwnd,UINT drive,UINT fmtID,UINT options); 

2.加载Shell32.dll库 

HINSTANCE hInstance=LoadLibrary(_T 

(“Shell32.dll”)); 

If(hInstance==NULL) return; 

3.获得函数指针 

PFNSHFORMATDRIVE pFnSHFormatDrive=( 

PFNSHFORMATDRIVE)GetProcessAddress(_T 

(“SHFormatDrive”)); 

if(pFnSHFormatDrive==NULL) 

FreeLibrary(hInstance); 

return; 

4.调用函数 

(pFnSHFormatDrive)(hwnd,drive/*a:==0*/,fmtID/* SHFMT_ID_DEFAULT */,options); 

5.释放句柄资源 

FreeLibrary(hInstance); 

Return; 

本程序在Windows 2000环境下调试通过,使用Delphi、Visual Basic的用户通过调用上述Windows SDK 函数也可以实现磁盘格式化。 

Ubuntu硬盘分区/格式化/挂载文件系统各种应用

硬盘上有些什么、文件们都有多大,在有些时候我们是需要关心的,所以这里简单介绍两个命令:df、du。一个Ubuntu硬盘可以划分4个区,3个主要分区,一个扩展分区,而扩展分区里可以划分n个逻辑分区,扩展...
  • u014313623
  • u014313623
  • 2014年04月14日 23:26
  • 1150

Linux格式化并重新加载磁盘

今天在用fio做完centos系统IO对比测试后,发现个严重的问题,用df工具查看磁盘,发现经过fio写操作的磁盘容量变成了这样:          瞬间就有一种不好的感觉,果然,经过多方查证,是由...
  • yhao2014
  • yhao2014
  • 2015年03月26日 12:50
  • 5490

linux下磁盘分区,格式化和挂载

按照规定,整个硬盘只能有4个主分区,包括基本分区和扩展分区。扩展分区最多只能有1个,扩展分区里可以分出多个任意大小的逻辑分区,而基本分区不可再分。我的硬盘有1T,sda1为系统盘,有30G,sda2有...
  • hejunqing14
  • hejunqing14
  • 2015年12月14日 15:30
  • 5861

编程实现获取linux服务器cpu、内存和磁盘使用率

1.获取cpu使用率的方法:
  • zaizai09
  • zaizai09
  • 2014年07月01日 21:44
  • 2666

精彩编程与编程技巧-格式化磁盘...

  • 2009年10月10日 17:46
  • 503B
  • 下载

VC++2012编程演练数据结构《36》磁盘文件进行排序

  • 2012年11月20日 19:29
  • 4KB
  • 下载

操作系统 实验 进程调度 银行家算法 多线程编程 存储管理 磁盘调度

  • 2009年09月05日 22:22
  • 385KB
  • 下载

VMware 虚拟化编程(5) — VixDiskLib 虚拟磁盘库详解之一

目录目录 前文列表 VixDiskLib 虚拟磁盘库 VixDiskLib_Init 初始化 VixDiskLib 库 VixDiskLib_Connect 连接到 virtual disk lib...
  • Jmilk
  • Jmilk
  • 2017年10月15日 00:37
  • 725

程序员编程艺术:第十章、如何给10^7个数据量的磁盘文件排序

本文转载自http://blog.csdn.net/v_july_v/article/details/6451990       第十章、如何给10^7个数据量的磁盘文件排序 ...
  • chivalrousli
  • chivalrousli
  • 2014年12月15日 17:07
  • 529

VMware虚拟磁盘编程指导(二)

2 安装开发包开发虚拟磁盘应用之前,需要按本章介绍的那样安装VDDK。对于备份应用,VADP开发还需要vSphere Web Services SDK。准备(Prerequisites)这一节讲述在V...
  • jslmes
  • jslmes
  • 2016年07月15日 08:43
  • 1075
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:磁盘格式化的编程实现
举报原因:
原因补充:

(最多只允许输入30个字)