質問

私はcを開こうとしています:成功せずにフィルストリームと直接:

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

System.uthorizedAccesSexceptionは処理されていませんでした

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:」と書かれています。このスラッシュはどこから来たのですか? :

cを開く機会はありますか: CreateFile API?

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

役に立ちましたか?

解決

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

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

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

他のヒント

ドライブを開くには、「。 shysicaldrive0」などのドライブ名が必要です。ドライブ名を見つけるには、querydosdevice()が必要です。 Windowsがこれを許可するオッズはそうです かなり最小限です.

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

この場合、最後に使用されます c: ドライブはそうでした c:\. 。だから開くとき c: あなたは最終的に開くことになります c:\.

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top