Открыть C: напрямую с FileStream без API CreateFile - PullRequest
3 голосов
/ 13 февраля 2010

Я пытался открыть C: напрямую с FileStream без успеха:

new FileStream("C:", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

Исключение System.UnauthorizedAccessException было обработано

Message = "Доступ к пути 'C: \' запрещен."

Источник = "mscorlib"

StackTrace:

  in  System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)

  in  System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)

  in  System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy)

  in  System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)

  in  ReadingMftNewTest.Program.Main(String[] args) in D:\CS\2008\ReadingMftNewTest\ReadingMftNewTest\Program.cs:line 76

Обратите внимание, что я открываю "C:", но ошибка говорит "C: \", откуда взялась эта косая черта? : \

Есть ли шанс открыть C: без использования CreateFile API?

Я действительно не хочу зависеть от WIN32 API, потому что этот код также должен работать на Mono, который не поддерживает WIN32 API, но успешно открывает устройства с обычным FileStream (Mono 1 Microsoft 0).

Ответы [ 3 ]

2 голосов
/ 13 марта 2010

Я наконец нашел способ сделать это:

new FileStream(@"C:\$Volume", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

Это работает только на томах NTFS.

1 голос
/ 13 февраля 2010

Для открытия диска требуется имя диска, например "\\. \ PhysicalDrive0". Поиск имени диска требует QueryDosDevice (). Вероятность того, что Windows это допустит, составляет довольно минимально .

1 голос
/ 13 февраля 2010

Когда вы ссылаетесь на корневой диск без \ в названии, которое вы используете, это равнозначно псевдониму в файловой системе. Он сопоставляется с последним рабочим каталогом, используемым под этим корневым диском. Это эквивалентно вводу d: или c: в окно cmd. Он перемещает вас на соответствующий корневой диск в последнем каталоге.

В этом случае последний путь, использованный на диске c:, был c:\. Таким образом, при открытии c: вы в конечном итоге открываете c:\.

Нет никакого способа избежать этого "псевдонима" с помощью API FileStream, о котором я знаю. Все API FileStream в конечном итоге отобразят путь, указанный с помощью Path.NormalizePath, перед вызовом CreateFile. Это функция, которая делает отображение.

...