磁盘格式化的编程实现

编程

盘格式化是计算机用户经常使用的操作之一,但由于操作系统的控制台和外壳(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 函数也可以实现磁盘格式化。

时间: 2024-10-03 01:57:43

磁盘格式化的编程实现的相关文章

linux磁盘格式化与管理知识点总结

对磁盘格式化就是创建文件系统,那么怎么实现格式化的呢?下面介绍一下实现磁盘格式化的命令及用法   首先我们来认识下Linux上的文件系统    /:根目录     /bin:二进制,可执行命令     /sbin:可执行命令,仅用于管理,通常只有管理员才有权限使用.     /boot:引导,操作系统用于引导系统启动的文件,一般指内核     /dev:设备文件              Linux的设备类型              字符设备:以c开头的文件,线性设备             

【LINUX】磁盘格式化 创建文件系统

格式化磁盘,将磁盘分区以后就要将磁盘格式化,否则是无法使用的.[root@localhost ~]# mke2fs -b:指定文件系统的block的大小,支持1024,2048,4096 bytes,默认4096 bytes -i:多少容量分配一个inode -j:默认的mke2fs 是ext2,加上-j 格式化为ext3 型文件系统. -c:检查磁盘错误,-c 会很快进行测试,-c -c 则会以read-write方式进行测试,时间会很长的. -L: 给文件系统一个标签. #将/dev/sdb

用VB6.0编写磁盘格式化程序

程序 软盘是数据的常用载体,我们的软件可能会提供用户将数据备份到软盘上的功能.为避免软盘上有带有病毒的文件,最安全的办法就是提醒用户将软盘格式化. Visual Basic可以通过调用API函数格式化一个磁盘,无论是软盘还是硬盘. 打开一个新的项目(project1) ,如果你没有更改过缺省模式,那么Visual Basic会自动添加一个form1文件,在form1上添加一个命令控件,将下面的代码拷入. Option Explicit Private Declare Function SHFor

Mac怎么将ntfs格式的磁盘格式化

  1. 首先下载NTFS For Mac. 下载之后就可以读取NTFS磁盘. 2. 插入要格式化的NTFS磁盘. 您可以在Mac OS X下通过命令行格式化NTFS磁盘.按照以下步骤进行操作: 启动命令行:应用程序 > 工具 > 终端; 输入diskutil获取帮助. 格式化命令图: 使用diskutil eraseVolume UFSD"Disk Label" 设备将所需分区格式化为NTFS. 注:如果NTFS磁盘标签只包含一个单词,则不需要使用引号. 3. 此外,在驱

RHCE 学习笔记(23) - 磁盘格式化和分区

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://beanxyz.blog.51cto.com/5570417/1603113 这一节学习RHEL7里面如何对磁盘进行分区和格式化,下一节会进一步学习如何配置LVM. 图形工具很简单,Disk工具打开就可以配置了,主要来看看命令行下如何配置MBR和GPT分区格式的硬盘. 传统的硬盘分区都是MBR格式,MBR分区位于0扇区,他一共512字节,前446字节是grub引导程序,这个会在后

centos查找未挂载磁盘格式化并挂载

查看当前linux服务器分区 df -h 查看当前linux服务器硬盘: fdisk -l /dev/sda   第一块硬盘 /dev/sdb   第二块硬盘 依此类推 以/dev/sdb为新增硬盘为例,需要进行以下操作方可正常使用   1.分区 fdisk /dev/sdb 依次输入 n,回车 p,回车 1,回车 回车 w   2.格式化 mkfs -t ext4 -c /dev/sdb1   3.挂载(挂载目录可自行定义) mount /dev/sdb1 /opt [root@RX-6276

如何快速格式化和磁盘碎片整理

快速格式化 所谓的快速格式化,在格式化过程中重写引导记录,不检测磁盘坏簇,FAT表中除坏簇以外所有表项清零,根目录表清空,数据区不变.而正常格式化会重写 引导记录,重新检查标记坏簇,其余表项清零,清空根目录表,对数据区清零.快速格式化后的硬盘,可以通过技术手段进行恢复. Dos下的format命令是用来进行格式化的. FORMAT A:或c:, d:等等,后面可以加一些参数 比如FORMAT A: /S 这是格式化并追加系统.也就是制作一个简单的启动盘. 如果给硬盘进行格式化(重装系统前的准备工

Linux 磁盘分区、格式化、目录挂载

实验环境: Citrix虚拟化, RHEL6.4系统环境 本文目的: 熟悉Linux的基本磁盘分区.格式化.目录挂载. 显示当前主机目录 磁盘分区 磁盘格式化 挂载目录 1. 显示当前主机目录 命令df -h [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_root 26G 2.9G 22G 13% / tmpfs 1.9G 0 1.9G 0% /dev/sh

linux磁盘管理

  一:Liunx的主引导记录被破坏了的修复手段:dd if=/dev/zero of=/dev/sda bs=单位大小 count=数目利用这条命令破坏主引导记录. 修复过程: 1:重启 a. 光盘挽救 b. 网络方式挽救 2:进入 rescue installed system 模式 3 进入shell模式 4:chroot /mnt/sysimage 5: grub-install /dev/sda 完成引导记录到挽救. 二:磁盘分区 1: fdisk /dev/sdb 输入该命令之后就可