2011-12-15 41 views
7

Estoy haciendo un programa para A2 Computing que exporta una gran cantidad de datos. Mi asignación de HDD en la red local es de aproximadamente 50 MB, por lo que es un buen candidato para probar el error "sin espacio en el disco".Espacio libre en disco en una unidad de red en Delphi

Actualmente, cuando el programa se queda sin espacio, se bloquea la exportación media con I/O Error 112. Me gustaría advertir con anticipación si el archivo puede exceder el espacio disponible. Sé lo grande que será el archivo (24.8 bytes por registro, en promedio), así que todo lo que necesito hacer es averiguar cuánto espacio hay libre.

Como estoy trabajando en una unidad de red, con una ruta de archivo como \\qmcsan1\Cxxxxx$\filename.csv, ¿cómo utilizo funciones como DiskFree para calcular el espacio disponible? Cualquier función de este tipo también necesita manejar unidades locales como C:/.

Cualquier idea muy apreciada.

+3

Ver RRUZ en este SO hilo [cómo-a-conseguir-disco-total-de-espacio-ventanas de unidad] (http://stackoverflow.com/questions/6383598/delphi-how-to -get-total-disk-space-of-windows-drive). Utiliza WMI y funciona en computadoras remotas. –

+0

@LU RD, el abuso de WMI es un enfoque realmente horrible. Preveo el caso cuando el usuario autorizado para usar el recurso compartido falla la verificación de privilegios de WMI. – OnTheFly

+4

@LU RD Si el usuario puede escribir en el volumen, es de suponer que solo pueden usar Win32 API para obtener espacio libre en lugar de necesitar WMI de gran peso. –

Respuesta

9

Un método sencillo es llamar a la función de API GetDiskFreeSpaceEx.

Desafortunadamente, esta función está mal declarada en la unidad Delphi Windows, al menos está en XE2. Pero hay una versión declarada en SysUtils que es correcta. ¡Asegúrate de usar esa versión!

program FreeDiskSpace; 
{$APPTYPE CONSOLE} 
uses 
    SysUtils; 

const 
    Folder = 'C:\'; 

var 
    FreeAvailable, TotalSpace: Int64; 

begin 
    if SysUtils.GetDiskFreeSpaceEx(PChar(Folder), FreeAvailable, TotalSpace, nil) then begin 
    Writeln(TotalSpace div (1024*1024*1024), 'GB total'); 
    Writeln(FreeAvailable div (1024*1024*1024), 'GB free'); 
    end; 
end. 
respuesta
+0

Gracias por esto, parece que funcionaría. El único problema es que soy un completo novato en Delphi. Estoy intentando 'GetDiskFreeSpaceEx (PWideChar (save_dialog.FileName), @freespace, nil, nil)', pero nunca almacena ningún número en 'freespace'. ¿Alguna idea de por qué? –

+0

Probablemente estés en una versión ANSI de Delphi. Ver mi actualización Realice los cambios descritos en mi párrafo final y llámelo así: 'GetDiskFreeSpaceEx (PChar (save_dialog.FileName), @freespace, nil, nil)'. O @TLama también podría ser correcto. –

+0

... o simplemente use 'PChar' y funcionará en todas las versiones de Delphi. – jpfollenius

Cuestiones relacionadas