2014-03-07 54 views
1

我想通過使用所有的空白空間使一個ntfs磁盤不可寫。有沒有一種方法可以創建一個文件並將文件大小設置爲磁盤的最大大小,然後將其重置爲較小值以使其再次可寫入?如果不是什麼是創建文件的最快方式?我正在使用delphi。同樣需要刪除它的最快方法。謝謝。最快的方式來創建一個大文件和最快的方式來刪除它

+0

只是好奇:將有什麼可能的用途? –

回答

2

您可以創建TFileStream並使用其Size屬性設置其大小。事情是這樣的......

var 
    F: TFileStream; 
begin 
    F:= TFileStream.Create('C:\BigFile', fmCreate); 
    try 
    F.Size:= 50000000000; 
    finally 
    F.Free; 
    end; 

這將創建一個文件C:\BigFile大小爲46GB左右。

您仍然必須根據可用空間量來計算要創建的文件的大小。請記住,這實際上並不寫入任何數據,它僅指示文件系統該文件具有一定的大小。

要刪除的文件,只需做同樣只設置大小爲0 ...

var 
    F: TFileStream; 
begin 
    F:= TFileStream.Create('C:\BigFile', fmCreate); 
    try 
    F.Size:= 0; 
    finally 
    F.Free; 
    end; 
    DeleteFile('C:\BigFile'); 

編輯

在我的大文件測試中,我意識到你必須使用Int64而不是Integer以適應這些大尺寸。

還要記住有文件不斷變化,特別是在Windows系統驅動器上。即使連續調用DiskFreeTFileStream.Size,也可能會導致磁盤空間不足。我建議寫一個例如比可用空間小100MB的文件,然後一次添加1MB,直到失敗,然後每次添加1KB,直到失敗,然後每次添加1個字節,直到失敗。然後你就會知道你可以保證所有的空間都是在沒有提出任何錯誤而完全失敗的情況下進行的。

這將像這樣的東西開始...

var 
    F: TFileStream; 
begin 
    F:= TFileStream.Create(FILENAME, fmCreate); 
    try 
    F.Size:= DiskFree(3) - (1024 * 1024 * 100); 
    while 1 = 1 do begin 
     try 
     F.Size:= F.Size + (1024 * 1024); 
     except 
     Break; 
     end; 
    end; 
    while 1 = 1 do begin 
     try 
     F.Size:= F.Size + 1024; 
     except 
     Break; 
     end; 
    end; 
    while 1 = 1 do begin 
     try 
     F.Size:= F.Size + 1; 
     except 
     Break; 
     end; 
    end; 
    finally 
    F.Free; 
    end; 

注意這可以更好地構建(據錯誤處理),但是這應該給你一個良好的開端。

+0

好的。但是,如何在不掛機的情況下快速刪除它們?爲此,我計劃加入進度條。 – megatr0n

+0

我想我不明白你的意思。刪除它是另一回事,但你也可以通過將文件大小設置爲0來實現。你是什​​麼意思懸掛應用程序和進度條?你有沒有試過我的代碼?這是瞬間的。 –

+0

你是什麼意思懸掛應用程序和進度條?我的意思是當我嘗試使用大文件的deletefile時,應用程序似乎沒有反應。我沒有試過你的代碼。我現在要去 – megatr0n