Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在以前锁定的分区上编写(使用Delphi)_Delphi_Locking - Fatal编程技术网

如何在以前锁定的分区上编写(使用Delphi)

如何在以前锁定的分区上编写(使用Delphi),delphi,locking,Delphi,Locking,我想锁定一个分区,使用TFileStream编写几个文件,然后解锁它。 我发现了如何锁定和解锁,但我不知道如何写。 到目前为止,我的代码是: Const FSCTL_LOCK_VOLUME = $00090018; FSCTL_UNLOCK_VOLUME = $0009001C; var HLockedVol: THandle; implementation {$R *.dfm} function LockDrive(Drive: AnsiChar): Boolean; va

我想锁定一个分区,使用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;
Const
FSCTL_LOCK_VOLUME=$00090018;
FSCTL_UNLOCK_卷=0009001C美元;
var HLockedVol:THandle;
实施
{$R*.dfm}
函数LockDrive(Drive:AnsiChar):布尔值;
变量
旧模式:UINT;
拜特斯:红衣主教;
开始
结果:=假;
OldMode:=设置错误模式(SEM\U故障临界错误);
尝试
HLockedVol:=创建文件(PChar(格式('\\.\%s:',[AnsiLowerCase(字符串(驱动器))))),通用读取,文件共享读取或文件共享写入,无,
打开(0,0);;
如果HLockedVol的句柄值无效,则
开始
结果:=设备控制(HLockedVol,FSCTL_LOCK_VOLUME,nil,0,nil,0,BytesReturned,nil);
结束;
最后
设置错误模式(旧模式);
结束;
结束;
函数UnlockDrive:布尔值;
变量
旧模式:UINT;
拜特斯:红衣主教;
开始
结果:=假;
OldMode:=设置错误模式(SEM\U故障临界错误);
尝试
如果HLockedVol的句柄值无效,则
开始
尝试
结果:=设备控制(HLockedVol,FSCTL_UNLOCK_VOLUME,nil,0,nil,0,BytesReturned,nil);
最后
闭合手柄(HLockedVol);
结束;
结束;
最后
设置错误模式(旧模式);
结束;
结束;
我想用HLockedVol,但我不知道如何

你能帮帮我吗?
谢谢。

您已打开某个文件并收到一个文件句柄。要写入它,请使用。如果你对溪流比较舒服,你可以把把手包在里面

请注意,执行此操作时,您并不是在编写文件。您直接将数据写入磁盘,在抽象级别之下,存在“文件”这样的概念。同时,您不能对任何普通文件执行I/O操作(因为您锁定了卷)


虽然这是对你所问问题的回答,但它可能不是你问题的解决方案。我邀请你发布一个新问题来描述你的问题;不要担心您目前正在寻求的解决方案。

您已打开某个文件并收到一个文件句柄。要写入它,请使用。如果你对溪流比较舒服,你可以把把手包在里面

请注意,执行此操作时,您并不是在编写文件。您直接将数据写入磁盘,在抽象级别之下,存在“文件”这样的概念。同时,您不能对任何普通文件执行I/O操作(因为您锁定了卷)


虽然这是对你所问问题的回答,但它可能不是你问题的解决方案。我邀请你发布一个新问题来描述你的问题;不要担心您目前正在寻求的解决方案。

锁定卷的目的是为了只写几个文件?要对分区(或卷)执行低级读写操作时,需要打开卷在扇区级别而不是文件级别。您甚至似乎没有锁定它-您将允许其他人在您的句柄仍然打开时打开它的句柄。致Eugene Mayevski’EldoS Corp:如果其他应用程序或Windows同时写入,我的应用程序将失败。David Heffernan:我在U盘/钥匙上测试了它,但我无法在文件管理器中访问它或在上面写入。但是如果你说的是真的,请告诉我一个更好的方法来锁定它。@John well我可能误读了MSDN文档,但是
FILE\u SHARE\u READ或FILE\u SHARE\u WRITE
授予其他人读写权限。但是,由于您打开的是整个卷,因此这一点可能没有意义。也许如果你打开一个卷,那么它会完全锁定它,我不知道。另外,如果您想让我们阅读您的邮件,请使用@David和@Eugene-这样我们可以收到邮件通知。@David:是的,您是对的,FILE\u SHARE\u read或FILE\u SHARE\u WRITE授予读/写权限。如果你认为有帮助的话,我会换的。但主要问题仍然没有解决:如何写入(最好使用TFileStream)…锁定卷以只写入几个文件的目的是什么?要对分区(或卷)执行低级读写操作时,需要打开卷在扇区级别而不是文件级别。您甚至似乎没有锁定它-您将允许其他人在您的句柄仍然打开时打开它的句柄。致Eugene Mayevski’EldoS Corp:如果其他应用程序或Windows同时写入,我的应用程序将失败。David Heffernan:我在U盘/钥匙上测试了它,但我无法在文件管理器中访问它或在上面写入。但是如果你说的是真的,请告诉我一个更好的方法来锁定它。@John well我可能误读了MSDN文档,但是
FILE\u SHARE\u READ或FILE\u SHARE\u WRITE
授予其他人读写权限。但是,由于您打开的是整个卷,因此这一点可能没有意义。也许如果你打开一个卷,那么它会完全锁定它,我不知道。另外,如果您想让我们阅读您的邮件,请使用@David和@Eugene-这样我们可以收到邮件通知。@David:是的,您是对的,FILE\u SHARE\u read或FILE\u SHARE\u WRITE授予读/写权限。如果你认为有帮助的话,我会换的。但主要问题仍然没有解决:如何编写(最好使用TFileStream)……是的,我知道我必须使用该句柄,但正如您所说,我不是在编写普通文件。在我发布一个新问题之前,我将在这里描述我需要什么:我的朋友让我制作一个程序,用一个虚拟文件填充U盘/钥匙/hdd上的所有可用空间。这种方式可以抵御大多数病毒。但有时我会因为其他程序(或操作系统)在上面写东西而出错。@John你怎么找到空闲空间?一旦开始在此句柄上写入,就会损坏文件系统。如果你想填满空闲空间,朱