Estoy pegandome en C# con las llamadas al sistema para manejar archivos de la api de windows y está empezando a tocarme la moral. Básicamente lo que quiero es hacer un benchmark de disco así que no me importa lo que escriba en disco sino como lo haga.
Estoy usando estas funciones importandolas y tengo problemas a la hora de leer y escribir.
[StructLayout(LayoutKind.Sequential)]
private struct OVERLAPPED
{
public int Internal;
public int InternalHigh;
public int Offset;
public int OffsetHigh;
public int hEvent;
}
[DllImport("kernel32.dll", SetLastError = true)]
private static extern int CreateFile(string lpFileName,
uint dwDesiredAccess,
uint dwShareMode,
IntPtr lpSecurityAttributes,
uint dwCreationDisposition,
uint dwFlagsAndAttributes,
IntPtr hTemplateFile);
[DllImport("kernel32.dll")]
private static extern bool WriteFile(int hFile,
byte[] lpBuffer,
int nNumberofBytesToWrite,
ref int lpNumberOfBytesWritten,
ref OVERLAPPED lpOverlapped);
[DllImport("kernel32.dll")]
private static extern bool ReadFile(int hFile,
byte[] lpBuffer,
int nNumberOfBytesToRead,
ref int lpNumberOfBytesReaded,
ref OVERLAPPED lpOverlapped);
[DllImport("kernel32.dll")]
private static extern int SetFilePointer(int hFile,
int lDistanceToMove,
ref int lpDistanceToMoveHigh,
int dwMoveMethod);
[DllImport("kernel32.dll")]
private static extern bool CloseHandle(int hFile);
Mas o menos de la siguiente manera, porque no me deja poner los parametros como he hecho otras veces con nulls o punteros nulos, tengo q tirar del IntPtr.Zero y no se si lo estoy haciendo bien. Hay cosas tambien como lo de pasarle la estructura esa overlapped con ref y el written tb con ref que no entiendo, pero es que simplemente no compila si no los pongo.
He visto en otros sitios que la funcion createfile les devuelve un IntPtr y no un int, y luego claro donde pide el handle en vez de un int ponen un IntPtr. Puede ser este el problema? es que me dieron las funciones así para añadir a mi código y me está rompiendo los huevos de la manera
byte[] buffer = new byte[1024];
private int written = 0;
private OVERLAPPED over = new OVERLAPPED();
archivo = CreateFile("arc", GENERIC_WRITE | GENERIC_READ, 0, IntPtr.Zero, CREATE_ALWAYS, 0, IntPtr.Zero);
if (WriteFile(archivo, buffer, 10, ref written, ref over))
{
tblog.AppendText(Environment.NewLine + "Escritura correcta");
}
else tblog.AppendText(Environment.NewLine + "Escritura incorrecta "+written);
CloseHandle(archivo);