C# 用C语言编程锁定硬盘#

C# 用C语言编程锁定硬盘#,c#,.net,C#,.net,我正在编写一个程序,它将定期(按计划)备份/格式化硬盘驱动器。在格式化过程中,我有一个第二个(相同的)驱动器将取代它。我要做的是锁定要格式化的驱动器(比如F:\)并(这部分是可选的…)将任何流量从F:\重定向到另一个驱动器(比如G:\) 那么,有没有一种方法可以使用C#来“锁定”F:\驱动器,这样就没有人可以读/写它了?我不希望有人在格式化运行之前尝试写入驱动器。就我目前的目的而言,关键是不能写入驱动器,但我更喜欢完全锁定(读写)。我知道对于一个文件,我可以使用file.Open(FullPat

我正在编写一个程序,它将定期(按计划)备份/格式化硬盘驱动器。在格式化过程中,我有一个第二个(相同的)驱动器将取代它。我要做的是锁定要格式化的驱动器(比如F:\)并(这部分是可选的…)将任何流量从F:\重定向到另一个驱动器(比如G:\)

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

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

那么,有没有一种方法可以使用C#来“锁定”F:\驱动器,这样就没有人可以读/写它了

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

MSDN:

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

…此操作对于需要在一段时间内以独占方式访问卷的应用程序非常有用,例如,磁盘实用程序和备份程序

作品:

…是否有一种方法可以将任何流量从F:\重定向到G:\


我不知道

格式化时是否尝试写入驱动器?
format
是否自行锁定驱动器?格式化会卸载驱动器,因此是的。不过,从备份到开始格式化之间会有一段短暂的时间(因为它几乎是实时备份的)。我希望锁定驱动器,这样我就可以进行备份,然后启动格式化,而不必冒备份时保存某些内容的风险,或者更糟糕的是,在备份和格式化之间。可以更改F:驱动器的字母,然后
subst
F:使用G:@Jean Françoisfare啊,好主意。有一天我必须试一试:)
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
);