我想锁定一个分区,使用TFileStream写几个文件,然后解锁它。 我找到了如何锁定和解锁,但我不知道如何写。 到目前为止,我的代码是:
Const
FSCTL_LOCK_VOLUME = $00090018;
FSCTL_UNLOCK_VOLUME = $0009001C;
var HLockedVol: THandle;
implementation
{$R *.dfm}
function LockDrive(Drive: AnsiChar): Boolean;
var
OldMode: UINT;
BytesReturned: Cardinal;
begin
Result := False;
OldMode := SetErrorMode(SEM_FAILCRITICALERRORS);
try
HLockedVol := CreateFile(PChar(Format('\\.\%s:', [AnsiLowerCase(string(Drive))])), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
OPEN_EXISTING, 0, 0);
if HLockedVol <> INVALID_HANDLE_VALUE then
begin
Result := DeviceIoControl(HLockedVol, FSCTL_LOCK_VOLUME, nil, 0, nil, 0, BytesReturned, nil);
end;
finally
SetErrorMode(OldMode);
end;
end;
function UnlockDrive: Boolean;
var
OldMode: UINT;
BytesReturned: Cardinal;
begin
Result := False;
OldMode := SetErrorMode(SEM_FAILCRITICALERRORS);
try
if HLockedVol <> INVALID_HANDLE_VALUE then
begin
try
Result := DeviceIoControl(HLockedVol, FSCTL_UNLOCK_VOLUME, nil, 0, nil, 0, BytesReturned, nil);
finally
CloseHandle(HLockedVol);
end;
end;
finally
SetErrorMode(OldMode);
end;
end;
我想使用HLockedVol,但我不知道如何......
你能帮帮我吗? 谢谢。答案 0 :(得分:3)
你已经打开了一些东西并收到了文件句柄。要写入,请使用WriteFile
。如果您对流更熟悉,可以将句柄包裹在THandleStream
内。
请注意,执行此操作时,您不会编写文件。您正在直接写入磁盘,以下抽象级别,其中存在“文件”这样的概念。并且在此期间您无法对任何普通文件执行I / O操作(因为您锁定了卷)。
虽然这是您提出的问题的答案,但它可能不是您问题的解决方案。我邀请您发布一个描述您问题的新问题;不要担心你现在正在寻求的解决方案。