【问题标题】:Programmatically lock hard drive in C#在 C# 中以编程方式锁定硬盘驱动器
【发布时间】:2017-10-17 02:05:06
【问题描述】:

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

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

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

【问题讨论】:

  • 格式化时是否尝试过写入驱动器? format不会自己锁驱动吗?
  • 格式化卸载驱动器,所以是的。不过,在备份和开始格式化之间会有一段短暂的时间(因为它是以接近实时的方式备份的)。我正在寻找锁定驱动器,以便我可以进行备份,然后开始格式化,而不会有在备份时保存某些内容的风险,或者更糟糕的是,在备份和格式化之间。

标签: c# .net


【解决方案1】:

操作:

那么,有没有一种方法可以使用 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) 的句柄来访问锁定的卷。有关详细信息,请参阅备注部分

...对于需要独占访问权 一段时间的应用程序(例如磁盘),此操作很有用实用程序和备份程序

操作:

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

我不知道

【讨论】:

  • 可以改F:盘符,然后substF:改用G:
  • @Jean-FrançoisFabre 好主意。有时间我一定要试一试:)
猜你喜欢
  • 2012-02-02
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 2011-07-19
  • 2012-08-07
  • 1970-01-01
  • 2013-11-15
  • 2011-08-06
相关资源
最近更新 更多