2017-10-17 88 views
0

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

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

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

+0

您是否尝试过书面方式来驱动,而格式化? 'format'不能自行锁定驱动器? – dcg

+0

格式化卸载驱动器,所以是的。在备份和格式开始之间会有一段短暂的时间(因为它在*接近*实时备份)。我正在寻求锁定驱动器,以便我可以进行备份,然后开始格式化,而不会在备份或备份和格式之间进行备份时保存某些内容。 – BrianH

回答

1

OP:

那么,有没有使用C#的方式,我可以“锁定” F:\驱动器,使任何人可以读/写呢?

是的,尽管不是C#,所以你需要对调用但使用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:\?

我不知道

+0

也许可以改变F:驱动器的字母,然后'subst' F:使用G: –

+0

@ Jean-FrançoisFabre好主意。我必须试一试:) – MickyD