4

C:をFileStreamで直接開こうとしましたが成功しませんでした:

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

System.UnauthorizedAccessExceptionが処理されませんでした

Message ="パス'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:\」と表示されていることに注意してください。このスラッシュはどこから来たのですか?:\

CreateFileAPIを使用せずにC:を開く機会はありますか?

このコードはWIN32APIをサポートしないMonoでも実行する必要があるため、WIN32 APIに依存したくありませんが、通常のFileStream(Mono 1 Microsoft 0)でデバイスを正常に開くことができます。

4

3 に答える 3

2

私はついにこれを行う方法を見つけました:

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

これはNTFSボリュームでのみ機能します。

于 2010-03-13T07:37:15.067 に答える
1

名前にを含まないルートドライブを参照する場合\、ファイルシステムのエイリアスに相当するものを使用しています。そのルートドライブで使用された最後の作業ディレクトリにマップされます。これは、d:またはc:cmdウィンドウに入力するのと同じです。最後のディレクトリの下の適切なルートドライブに移動します。

この場合、c:ドライブで使用された最後のパスはでしたc:\。したがって、開くと、開くc:ことになりますc:\

FileStream私が知っているAPIを使用してこの「エイリアシング」を回避する方法はありません。すべてのAPIは、 CreateFileを呼び出す前にFileStream、で指定されたパスを最終的にマップします。Path.NormalizePathマッピングを行う関数です。

于 2010-02-13T17:37:09.390 に答える
1

ドライブを開くには、「\\。\PhysicalDrive0」のようなドライブ名が必要です。ドライブ名を見つけるには、QueryDosDevice()が必要です。Windowsがこれを許可する可能性はかなり最小限です。

于 2010-02-13T17:43:30.600 に答える