磁盘格式化的编程实现

转载 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 函数也可以实现磁盘格式化。 

“驱动器中的磁盘未被格式化”解决办法

“驱动器中的磁盘未被格式化”,是因为文件系统的内部结构损坏了。要恢复里面的数据,暂时别格式化这个盘,具体步骤看正文 工具/软件:极光数据恢复软件 数据恢复方法: 数据恢复...
  • qq_40829066
  • qq_40829066
  • 2017-12-06 09:30:56
  • 607

linux格式化磁盘命令

linux格式化磁盘命令              linux mkfs         指令:mkfs   使用权限 : 超级使用者   使用方式 : mkfs [-V...
  • huangjin0507
  • huangjin0507
  • 2015-07-29 09:49:12
  • 26648

C++格式化磁盘源码

  • 2011年03月18日 12:45
  • 1.98MB
  • 下载

磁盘格式化工具.用于快速格式化电脑磁盘

  • 2010年06月28日 21:12
  • 264KB
  • 下载

Linux系统中使用shell判断磁盘是否格式化的方法

由于项目的需要,需要对emmc进行分区完成后并格式化操作,思路有三种:第一种在uboot中实现,以前的uboot有一些格式化命令,可是现在新版本的不知道是哪个,之前的版本uboot可能是被移植过去的;...
  • u010406724
  • u010406724
  • 2015-05-26 15:28:11
  • 2757

windows下初始化格式化磁盘

#include "stdafx.h" #include "CMDiskManager.h" CMDiskManager::CMDiskManager(){} /* 获取磁盘分区信息 vDiskN...
  • wuzuyu365
  • wuzuyu365
  • 2016-10-21 11:38:29
  • 2350

DOS命令diskpart格式化磁盘

1  win + r   -> cmd  进入dos 2  输入 diskpart 3  list disk  查看都有哪些磁盘 4  select disk 1(选择要格式化的磁盘前面的编号)...
  • u013005025
  • u013005025
  • 2016-10-27 17:14:17
  • 17712

RedHat Linux磁盘分区、格式化、挂载、卸载

[root@CORPSE2010/]# fdisk -l Disk /dev/sda: 322.1 GB, 322122547200 bytes 255 heads, 63 sectors...
  • corpse2010
  • corpse2010
  • 2015-08-20 17:47:26
  • 2056

【磁盘处理相关方法】4,格式化磁盘 (Windows标准格式化界面和静默无界面格式化方法)

1,目的 介绍一些格式化磁盘的方法,某些程序可能会创建一些自己的盘符,分区的创建涉及到驱动开发。 一般会在使用分区前进行格式化,这个可以用API实现。 下面介绍2种格式化磁盘的方法,一种是弹出平常...
  • dpsying
  • dpsying
  • 2014-01-13 00:09:28
  • 3148

Linux格式化并重新加载磁盘

今天在用fio做完centos系统IO对比测试后,发现个严重的问题,用df工具查看磁盘,发现经过fio写操作的磁盘容量变成了这样:          瞬间就有一种不好的感觉,果然,经过多方查证,是由...
  • yhao2014
  • yhao2014
  • 2015-03-26 12:50:10
  • 5968
收藏助手
不良信息举报
您举报文章:磁盘格式化的编程实现
举报原因:
原因补充:

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