2010-07-22 7 views
1

J'utilise une importation pour ouvrir un disque dur physique connecté:Quelle est la meilleure méthode?

var sfh = Imports.CreateFile(Path, Imports.FileAccess.GenericAll, Imports.FileShare.None, IntPtr.Zero, Imports.CreationDisposition.OpenExisting, 0, IntPtr.Zero); 
if (sfh.IsInvalid) 
{ 
    Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); 
    return; 
} 
Geometry = Imports.GetGeometry(sfh); 
var fs = new FileStream(sfh, FileAccess.ReadWrite, (int)Geometry.BytesPerSector, false); 

Cela fonctionne très bien, mais au lieu d'utiliser FileStream, je me demandais si ce serait un moyen plus efficace pour lire des octets à partir du lecteur : http://msdn.microsoft.com/en-us/library/aa365467%28v=VS.85%29.aspx

+2

Sous le couvre, le cadre appelle presque certainement la fonction ReadFile win32 que vous avez liée, et ce, de manière efficace. –

Répondre

1

La rapidité et/ou l'efficacité sont-elles si importantes pour vous? parce que la différence est probablement mineure dans ce cas ...

Il semble que le lien que vous avez donné utilise une méthode WinAPI. J'éviterais d'utiliser ceux-ci si vous n'êtes pas obligé de le faire car .net GarbageCollector ne fonctionne pas bien avec les ressources natives, et vous pourriez souffrir de fuites de mémoire si vous ne les manipulez pas correctement ...

+0

Plus comme lire les octets correctement. Avec le FileStream, je dois m'assurer qu'il lit les bons octets et autres parce qu'ils sont alignés par secteur. Je veux savoir si cela permettra d'éliminer les problèmes potentiels avec les secteurs. Je fais cela pour aller à une position var cnt = Position% Geometry.BytesPerSector! = 0? Geometry.BytesPerSector: 0x200; if (cnt! = 0) { EIO.SetPosition (Position - cnt); EIO.Reader.ReadBytes ((int) cnt); retour; } EIO.SetPosition (Position); – Eaton

+0

Ah, ça n'est pas bien sorti. : x http://pastie.org/private/et0oy1ggugqk5ktx3wg – Eaton

Questions connexes