我试图通过耗尽所有空白区域来使ntfs磁盘不可写。有没有办法我可以创建一个文件并将文件大小设置为磁盘的最大大小,然后将其重置为较小的值,使其可以再次写入?如果不是创建文件的最快方法是什么?我正在使用delphi。此外,还需要最快速的删除方法。谢谢。
答案 0 :(得分:2)
您可以创建TFileStream
并使用其Size
属性设置其大小。像这样......
var
F: TFileStream;
begin
F:= TFileStream.Create('C:\BigFile', fmCreate);
try
F.Size:= 50000000000;
finally
F.Free;
end;
这将创建一个大小约为46GB的文件C:\BigFile
。
您仍然需要根据可用空间量计算要创建的文件的大小。请记住,这实际上不会写入任何数据,它只会指示文件系统文件是否具有特定大小。
要删除文件,只需将其设置为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系统驱动器上。即使对DiskFree
和TFileStream.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;
请注意,这可以更好地构建(就错误处理而言),但这应该会给你一个良好的开端。