Вопрос

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

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

System.UnauthorizedAccessException была неразрушающей

Сообщение = "Доступ к пути 'c: ' отрицается."

Source = "MSCORLIB"

Трассировки стека:

  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?

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

Это было полезно?

Решение

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

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

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

Другие советы

Открытие диска требует названия диска, например, «. PhysicalDrive0». Поиск названия диска требует QueryDosDevice (). Шансы на то, что Windows позволит это довольно минимально.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top