Función GetFileInformationByHandle

Iniciado por el_doctor, 28 Noviembre 2014, 18:04 PM

0 Miembros y 1 Visitante están viendo este tema.

el_doctor

puedo usar la función GetFileInformationByHandle para obtener el espacio usado por un archivo especifico HANDLE hFile en la documentación de oficial de Microsoft el puntero que retorna de BY_HANDLE_FILE_INFORMATION  no hay una propiedad igual que en FILE_STANDARD_INFO -> AllocationSize que es el valor que necesito y la cuestión es que esta función la quiero ejecutar en Windows XP por eso no puedo usar GetFileInformationByHandleEx es posible usar GetFileInformationByHandle y obtener el mismo valor?

x64core

Cita de: el_doctor en 28 Noviembre 2014, 18:04 PM
puedo usar la función GetFileInformationByHandle para obtener el espacio usado por un archivo especifico HANDLE hFile en la documentación de oficial de Microsoft el puntero que retorna de BY_HANDLE_FILE_INFORMATION  no hay una propiedad igual que en FILE_STANDARD_INFO -> AllocationSize que es el valor que necesito y la cuestión es que esta función la quiero ejecutar en Windows XP por eso no puedo usar GetFileInformationByHandleEx es posible usar GetFileInformationByHandle y obtener el mismo valor?

Utiliza NtQueryInformationFile + FileStandardInformation.


typedef struct _FILE_STANDARD_INFORMATION
{
     LARGE_INTEGER AllocationSize;
     LARGE_INTEGER EndOfFile;
     ULONG NumberOfLinks;
     UCHAR DeletePending;
     UCHAR Directory;
} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;

el_doctor


x64core

Cita de: el_doctor en 28 Noviembre 2014, 18:33 PM
Usando GetProcAddress?
No hay necesidad, podes importarla normalmente, vas a necesitar la ntdll.lib que podes encontrar en el WDK luego: propiedades -> linker -> input -> escribes el nombre. Bueno eso es para Visual studio que es el mejor para gente que esta programando para Windows.

el_doctor

pues no tengo claro como hacer la implementacion mi método que tengo que falla en en win xp es el siguiente:


DWORD GetFileSize(HANDLE hFile)
{

  DWORD dwFileSizeHi = 0;
  DWORD dwFileSizeLo = GetFileSize(hFile, &dwFileSizeHi); 

  if(dwFileSizeLo == INVALID_FILE_SIZE )
  {
  FILE_STANDARD_INFO finfo;

  ZeroMemory(&finfo,sizeof(finfo));

  GetFileInformationByHandleEx(hFile,FileStandardInfo, &finfo, sizeof(finfo));

  dwFileSizeLo = finfo.AllocationSize.LowPart;
  }
 
  return dwFileSizeLo;
}

Eternal Idol

#5
¿Te fijaste ya que devolvia GetLastError?

Note that if the return value is INVALID_FILE_SIZE (0xffffffff), an application must call GetLastError to determine whether the function has succeeded or failed. The reason the function may appear to fail when it has not is that lpFileSizeHigh could be non-NULL or the file size could be 0xffffffff.

¿Y si usas directamente GetFileSizeEx? Esta disponible en XP.

PD. El tamaño del archivo se corresponde con el EndofFile y no con el AllocationSize (eso corresponde con el tamaño que ocupa en disco, es decir redondeado en clusters).
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

x64core

Cita de: el_doctor en 28 Noviembre 2014, 18:59 PM
pues no tengo claro como hacer la implementacion mi método que tengo que falla en en win xp es el siguiente:


DWORD GetFileSize(HANDLE hFile)
{

 DWORD dwFileSizeHi = 0;
 DWORD dwFileSizeLo = GetFileSize(hFile, &dwFileSizeHi);  

 if(dwFileSizeLo == INVALID_FILE_SIZE )
 {
 FILE_STANDARD_INFO finfo;

 ZeroMemory(&finfo,sizeof(finfo));

 GetFileInformationByHandleEx(hFile,FileStandardInfo, &finfo, sizeof(finfo));

 dwFileSizeLo = finfo.AllocationSize.LowPart;
 }
 
 return dwFileSizeLo;
}

Sí y viendo el código porqué razon necesitas el valor en AllocationSize? Ya que si primero utilizas GetFileSize y luego sobreescribes el valor retornado por GetFileInformationByHandleEx en la misma variable... En XP falla ya que GetFileInformationByHandleEx no es exportada.

el_doctor

muy agradecido al final use GetFileSizeEx. Gracias por su ayuda.

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón