2017-10-17 110 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