2010-02-13 4 views
3

J'essaie d'ouvrir C: directement avec FileStream sans succès:ouvert C: Directement avec `` FileStream` sans CreateFile` API

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

System.UnauthorizedAccessException était unhandled

Message = "Accès au chemin 'C: \' est refusé. "

Source = "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 

Notez que j'openning "C:" mais l'erreur dit "C: \", d'où vient cette barre oblique vient? : \

Y at-il une chance d'ouvrir C: sans utiliser l'API CreateFile?

Je ne veux vraiment pas dépendre de l'API WIN32 car ce code devrait aussi fonctionner sur Mono qui ne supporte pas l'API WIN32, mais qui ouvre avec succès les périphériques avec FileStream régulier (Mono 1 Microsoft 0).

+0

C: ** n'est pas ** un fichier. C'est un lecteur qui apparaît sur le système de fichiers en tant que _folder_. Qu'est-ce que vous essayez de faire avec une fois que vous l'avez ouvert? –

+1

De plus, si vous voulez qu'il fonctionne en mono, vous ne devriez jamais faire référence à "C:". Il n'est pas susceptible d'exister sur les plates-formes mono a été écrit pour. Il n'est même pas garanti d'exister sur Windows. –

+0

Je veux lire la structure MFT (NTFS) directement à partir du disque. Dans le futur, je vais lire aussi la liste des fichiers FAT32. En supposer que je peux obtenir les chemins de 'DriveInfo' et le fichier'/etc/mtab', le chemin final ressemble ''/dev/sda1' – DxCK

Répondre

2

J'ai finalement trouvé une façon de le faire:

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

Cela ne fonctionne que sur les volumes NTFS.

1

Lorsque vous référencez un lecteur racine sans le \ dans le nom, vous utilisez ce qui équivaut à un alias dans le système de fichiers. Il correspond au dernier répertoire de travail utilisé sous ce lecteur racine. C'est l'équivalent de taper d: ou c: dans une fenêtre cmd. Il vous déplace vers le lecteur racine approprié sous le dernier répertoire.

Dans ce cas, le dernier chemin utilisé sur le lecteur c: était c:\. Donc, lors de l'ouverture c: vous finissez par ouvrir c:\.

Il n'y a aucun moyen d'éviter cet "alias" en utilisant l'API FileStream que je connais. Toutes les API FileStream finiront par mapper le chemin donné avec Path.NormalizePath avant d'appeler CreateFile. C'est la fonction qui fait le mapping.

1

L'ouverture du lecteur nécessite le nom du lecteur, par exemple "\\. \ PhysicalDrive0". La recherche du nom du lecteur nécessite QueryDosDevice(). Les chances que Windows permettra ceci sont fairly minimal.

+0

"\\. \ PhysicalDrive0" ouvrira tout le disque dur, tandis que "\\. \ C:" ouvre une partition spécifique. – DxCK