以编程方式锁定C#中的硬盘

时间:2017-10-17 02:05:07

标签: c# .net

我正在编写一个程序,定期(按计划)备份/格式化硬盘。在格式化过程中,我有一个第二个(相同的)驱动器,它将占据它的位置。我想要做的是锁定要格式化的驱动器(让我们说F:\)和(这部分是可选的......)将任何流量从F:\重定向到另一个驱动器(让我们说G:\)。 / p>

那么,有没有办法使用C#我可以“锁定”F:\驱动器,以便没有人可以读/写它?我不希望有人在格式运行之前尝试写入驱动器。就我的目的而言,关键是不能写入驱动器,但我更喜欢完全锁(读和写)。我知道一个文件,我可以使用File.Open(FullPath, FileMode.Open, FileAccess.ReadWrite, FileShare.None)来阻止其他人访问它。驱动器有类似的东西吗?

如果可以,那么作为奖励,有没有办法可以将任何流量从F:\重定向到G:\? (G:\正在近乎实时地从F:\复制,因此任何读取/打开都应该可以在文件路径中简单地用G替换F,但我不确定这是否可以通过编程方式实现)。

1 个答案:

答案 0 :(得分:1)

OP:

  

那么,有没有办法使用C#我可以"锁定" F:\驱动器,以便没有人可以读/写它?

是的,虽然不是c#所以你需要p-invoke但是要使用IOCTL FSCTL_LOCK_VOLUME

BOOL DeviceIoControl(
  (HANDLE) hDevice,            // handle to a volume
  (DWORD) FSCTL_LOCK_VOLUME,   // dwIoControlCode
  NULL,                        // lpInBuffer
  0,                           // nInBufferSize
  NULL,                        // lpOutBuffer
  0,                           // nOutBufferSize
  (LPDWORD) lpBytesReturned,   // number of bytes returned
  (LPOVERLAPPED) lpOverlapped  // OVERLAPPED structure
);

MSDN:

  

如果卷未使用,则锁定该卷。只能通过锁定卷的文件对象(* hDevice)的句柄访问锁定的卷。有关更多信息,请参阅备注部分

     

...此操作对于独占访问 一段时间的应用程序非常有用 - 例如,磁盘实用程序和备份程序

OP:

  

...有没有办法可以将任何流量从F:\重定向到G:\?

我不知道