maintenant ... Je ne sais pas vraiment si ce sera utile pour vous:
[StructLayout(LayoutKind.Sequential)]
public struct StartingVcnInputBuffer
{
public long StartingVcn;
}
public static readonly int StartingVcnInputBufferSizeOf = Marshal.SizeOf(typeof(StartingVcnInputBuffer));
[StructLayout(LayoutKind.Sequential)]
public struct RetrievalPointersBuffer
{
public uint ExtentCount;
public long StartingVcn;
public long NextVcn;
public long Lcn;
}
public static readonly int RetrievalPointersBufferSizeOf = Marshal.SizeOf(typeof(RetrievalPointersBuffer));
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern SafeFileHandle CreateFileW(
[MarshalAs(UnmanagedType.LPWStr)] string filename,
[MarshalAs(UnmanagedType.U4)] FileAccess access,
[MarshalAs(UnmanagedType.U4)] FileShare share,
IntPtr securityAttributes,
[MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
[MarshalAs(UnmanagedType.U4)] FileAttributes flagsAndAttributes,
IntPtr templateFile);
[DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true, CharSet = CharSet.Auto)]
static extern bool DeviceIoControl(IntPtr hDevice, uint dwIoControlCode,
ref StartingVcnInputBuffer lpInBuffer, int nInBufferSize,
out RetrievalPointersBuffer lpOutBuffer, int nOutBufferSize,
out int lpBytesReturned, IntPtr lpOverlapped);
// Returns a FileStream that can only Read
public static void GetStartLogicalClusterNumber(string fileName, out FileStream file, out long startLogicalClusterNumber)
{
SafeFileHandle handle = CreateFileW(fileName, FileAccess.Read | (FileAccess)0x80 /* FILE_READ_ATTRIBUTES */, FileShare.Read, IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero);
if (handle.IsInvalid)
{
throw new Win32Exception();
}
file = new FileStream(handle, FileAccess.Read);
var svib = new StartingVcnInputBuffer();
int error;
RetrievalPointersBuffer rpb;
int bytesReturned;
DeviceIoControl(handle.DangerousGetHandle(), (uint)589939 /* FSCTL_GET_RETRIEVAL_POINTERS */, ref svib, StartingVcnInputBufferSizeOf, out rpb, RetrievalPointersBufferSizeOf, out bytesReturned, IntPtr.Zero);
error = Marshal.GetLastWin32Error();
switch (error)
{
case 38: /* ERROR_HANDLE_EOF */
startLogicalClusterNumber = -1; // empty file. Choose how to handle
break;
case 0: /* NO:ERROR */
case 234: /* ERROR_MORE_DATA */
startLogicalClusterNumber = rpb.Lcn;
break;
default:
throw new Win32Exception();
}
}
Notez que la méthode retourne un FileStream
que vous pouvez garder ouvert et utiliser pour lire le fichier, ou vous pouvez facilement le modifier pour ne pas le renvoyer (et ne pas le créer), puis rouvrir le fichier lorsque vous voulez le hacher.
Pour utiliser:
string[] fileNames = Directory.GetFiles(@"D:\");
foreach (string fileName in fileNames)
{
try
{
long startLogicalClusterNumber;
FileStream file;
GetStartLogicalClusterNumber(fileName, out file, out startLogicalClusterNumber);
}
catch (Exception e)
{
Console.WriteLine("Skipping: {0} for {1}", fileName, e.Message);
}
}
J'utilise l'API décrite ici: http://www.wd-3.com/archive/luserland.htm. Le programme est beaucoup plus facile car vous n'avez besoin que du numéro de cluster logique initial (la première version du code pourrait extraire toutes les extensions LCN, mais cela serait inutile, car vous devez hacher un fichier du premier au dernier octet). Notez que les fichiers vides (fichiers de longueur 0) n'ont aucun cluster alloué. La fonction renvoie -1
pour le cluster (ERROR_HANDLE_EOF
). Vous pouvez choisir comment le gérer.
Vous pouvez http://stackoverflow.com/questions/11934550/get-file-offset-on-disk-cluster-number ...Notez que je ne pense pas que ce soit une bonne idée ... Corrige que ... Je ** fais ** pense que c'est une ** mauvaise idée ** – xanatos
@xanatos pourquoi est-ce une mauvaise idée? – oleksii
@oleksii Je ne sais même pas de quelles autorisations vous avez besoin ... et faire quelque chose de bas niveau avec des disques seulement parce que les méthodes de haut niveau sont lentes n'est pas quelque chose que je ferais jamais. Il y a une raison pour laquelle il existe des méthodes de haut niveau et des méthodes de bas niveau. – xanatos