磁碟快速格式化的理論和實踐 (轉)

worldblog發表於2007-12-03
磁碟快速格式化的理論和實踐 (轉)[@more@]


  的格式化可以分為低階格式化和高階格式化。低階格式化是針對而言的,它能將硬碟中的資料全部清除,包括硬碟的主開機記錄、DOS引導記錄和分割槽表資訊,當然也能掃除將磁碟作為藏身之處的一切。較老版本的CMOS設定中包括了硬碟低階格式化的,可以在CMOS中對硬碟低格,也可以使用一些低格如DM等完成低格操作。磁碟的高階格式化有幾種形式,格式化就是其中的一種,與DOS一起發表的基本FORMAT程式允許對磁碟快速格式化(可選引數/Q)。在介紹快速格式化之前,先對磁碟的結構作一個簡單的介紹,再將快速格式化和一般的高階格式化作一個比較。
  一個被成功高階格式化的硬碟可以分成以下幾個部分:主開機記錄和分割槽表資訊、DOS引導記錄、分配表()資訊、根目錄()資訊和資料區。主開機記錄和分割槽表資訊存放在硬碟的第一個扇區中,主開機記錄可以根據操作的不同而任意編寫,基於這一特點,實現多並存就不是一件困難的事情。分割槽表是硬碟第一個扇區中最後64個位元組,對應地分別以“80H”和“55AAH”為起始和結束標誌。它記錄著硬碟邏輯區的個數、起始和結束的扇區號等資訊,其中的“80H”和“55AAH”被稱為是硬碟的兩個關鍵程式碼,丟失後硬碟將不會自舉。DOS引導記錄儲存了對於引導系統的三個檔案的描述,它也包括一個分割槽表資訊。檔案分配表和根目錄資訊記錄著檔案的名字、屬性等以及存放的地址,在檔案定位時,結合分配表資訊和根目錄資訊,就可以很方便地找到檔案。資料區是硬碟中佔用扇區最多的一個部分,用於儲存檔案資料。
  再來看看檔案刪除的過程:修改檔案分配表對應資訊、將檔名的第一個字元改掉以及釋放磁碟空間。必須注意,存放在資料區的檔案內容並沒有被刪除,因此刪除的檔案可以被恢復。對比地看,磁碟的高階格式化主要做了以下工作:對磁碟劃分磁軌和扇區、向主引導區和DOS引導區寫入引導資訊、清空檔案分配表和根目錄區並掃描磁軌。然而快速格式化卻不同,它沒有進行磁軌掃描,因此,快速格式化和完全刪除磁碟檔案在效果上是相同的。
  與硬碟的結構相比,中沒有主引導區。高階格式化對軟盤同樣要做四件事情,不過就FORMAT 命令而言,在操作之前,會將檔案分配表、根目錄區的內容以映象形式儲存到磁碟最後幾個扇區中,這樣一來,軟盤資料又能被“反格式化”操作恢復回來(只要資料區內容沒有被覆蓋掉)。
  鑑於1.44MB 3.5英寸軟盤FAT區和根目錄區所佔扇區數是不變的(FAT1: Sector 1-9; FAT2: Sector 10-18; ROOT: Sector 19-32),我們可以上機實踐一下,編寫一個快速格式化程式,實現對1.44MB 3.5英寸軟盤的快速格式化。由於程式較簡單,沒有儲存UNFORMAT資訊,所以格式化完成後資料無法恢復,因此實驗時應特別小心。我們可以利用C語言庫abswrite來實現快速格式化,因為它是被定義在dos.h標頭檔案中的,因此程式開始時應寫上:
  #include
以下是此函式的原形,在此寫出便於參考學習:
  int abswrite (int drive, int nsects, int lsect, void *buffer);
與之對應的absread函式原形:
  int absread (int drive, int nsects, int lsect, void *buffer);
  思路:因為快速格式化是將FAT區和ROOT區清空,那麼我們可以利用abswrite函式向這兩個區域寫零,達到資料清空的目的。程式程式碼如下:
#include
#include

unsigned char buff[512];

main()
{
int i;char c;
 printf (“nQuick Format 1.44MBn”);
printf (“Program by ChenQingyang.n”);
printf (“ALL DATA IN THE FLOPPY DISK WILL BE LOST!!n”);
printf (“nInsert a diskette for drive A:n”);
printf (“and press ENTER when ready. . .”);c=getchar();
printf (“nnCleaning FAT area. . .”);
buff[0]=0xf0;buff[1]=buff[2]=0xff;
for (i=3;i<512;i++) buff[i]=0;
abswrite(0,1,1,buff);
abswrite(0,1,10,buff);
for (i=0;i<512;i++) buff[i]=0;
for (i=2;i<10;i++) abswrite (0,1,i,buff);
for (i=11;i<19;i++) abswrite (0,1,i,buff);
printf (“nCleaning ROOT area. . .”);
for (i=19;i<33;i++) abswrite (0,1,i,buff);
printf (“nnQuickFormat Completed!n”);
}

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987737/,如需轉載,請註明出處,否則將追究法律責任。

相關文章