Espaço Livre de um Disco na Rede

Delphi

27/04/2005

Bom dia,

Alguém poderia me ajudar, pois estou querendo saber o espaço disponivel em Disco de várias máquinas da rede, lembrando que o programa será executado em uma única máquina.
O espaço disponivel de uma máquina local (C:\) eu consigo saber, só não consigo saber o espaço de uma máquina da rede (\\teste\c...).

Atenciosamente,

Leandro.


Leandroborba

Leandroborba

Curtidas 0

Respostas

Jáder Medeiros

Jáder Medeiros

27/04/2005

uses
FileCtrl, SysUtils, Windows;

Function GetFreeSpace(sPath: String): Int64;
var
sNetPath: String;
dwMaxNetPathLen,RetornoMap: DWord;
i: Integer;
DriversDisponiveis: array of Char;
const
Drivers: array[1..24] of Char = (´C´,´D´,´E´,´F´,´G´,´H´,´I´,´J´,´K´,´L´,´M´,´N´,´O´,´P´,´Q´,´R´,´S´,´T´,´U´,´V´,´W´,´X´,´Y´,´Z´);
begin
Result := 0;
if Pos(´:´,sPath) > 0 then
Result := DiskFree(Ord(sPath[1]) - 64)
else
try
dwMaxNetPathLen := MAX_PATH;
SetLength(sNetPath,dwMaxNetPathLen);
if Copy(sPath,Length(sPath),1) = ´\´ then
Delete(sPath,Length(sPath),1);
for i := Low(Drivers) to High(Drivers) do begin
if DirectoryExists(Drivers[i]+´:\´) then
if WNetGetConnection(PChar(String(Drivers[i]+´:´)),PChar(sNetPath),dwMaxNetPathLen) = NO_ERROR then
if Pos(0,sNetPath) > 0 then
if LowerCase(sPath) = LowerCase(Copy(sNetPath,1,Pos(#0,sNetPath)-1)) then
Result := DiskFree(Ord(Drivers[i]) - 64)
else
else
if LowerCase(sPath) = LowerCase(sNetPath) then
Result := DiskFree(Ord(Drivers[i]) - 64)
else
else
if ExtractFileDrive(sPath) = Drivers[i]+´:´ then
Result := DiskFree(Ord(Drivers[i]) - 64)
else
else begin
SetLength(DriversDisponiveis,High(DriversDisponiveis)+2);
DriversDisponiveis[High(DriversDisponiveis)] := Drivers[i]
end;
if Result > 0 then
Exit
end;
if Result = 0 then
for i := Low(DriversDisponiveis) to High(DriversDisponiveis) do begin
RetornoMap := WNetAddConnection(PChar(sPath),´´,PChar(String(DriversDisponiveis[i]+´:´)));
case RetornoMap of
ERROR_ACCESS_DENIED: raise Exception.Create(´Acesso negado.´);
ERROR_ALREADY_ASSIGNED: raise Exception.Create(´A letra do drive especificada já está conectada.´);
ERROR_BAD_DEV_TYPE: raise Exception.Create(´O tipo de dispositivo e o tipo de recurso não são compatíveis.´);
ERROR_BAD_DEVICE: raise Exception.Create(´Letra inválida.´);
ERROR_BAD_NET_NAME: raise Exception.Create(´Nome do servidor não é válido ou não pode ser localizado.´);
ERROR_BAD_PROFILE: raise Exception.Create(´Formato incorreto de parâmetros.´);
ERROR_CANNOT_OPEN_PROFILE: raise Exception.Create(´Conexão permanente não disponível.´);
ERROR_DEVICE_ALREADY_REMEMBERED: raise Exception.Create(´Uma entrada para o dispositivo especificado já está no perfil do usuário.´);
ERROR_EXTENDED_ERROR: raise Exception.Create(´Erro de rede.´);
ERROR_INVALID_PASSWORD: raise Exception.Create(´Senha especificada inválida.´);
ERROR_NO_NET_OR_BAD_PATH: raise Exception.Create(´A operação não foi concluída porque a rede não foi inicializada ou caminho é inválido.´);
ERROR_NO_NETWORK: raise Exception.Create(´A rede não está presente.´);
ERROR_LOGON_FAILURE: raise Exception.CreateFmt(´Não foi possível mapear o caminho ¬s pois é necessário informar usuário e senha.´,[sPath])
else
begin
Result := DiskFree(Ord(DriversDisponiveis[i]) - 64);
WNetCancelConnection(PChar(String(DriversDisponiveis[i]+´:´)),False);
case GetLastError of
2401: raise Exception.CreateFmt(´A unidade ¬s está sendo utilizada.´1310´Feche suas aplicações e tente novamente.´,[DriversDisponiveis[i]]);
1205: raise Exception.Create(´Não foi possível abrir o perfil´);
1206: raise Exception.Create(´Perfil do usuário não encontrado ou inválido´);
1208: raise Exception.Create(´Ocorreu um Erro específico na rede´);
2138: raise Exception.Create(´Rede não encontrada ou fora do ar´);
2250: raise Exception.CreateFmt(´Mapeamento ¬s inválido ou não encontrado´,[DriversDisponiveis[i]])
end;
Break
end
end;
end;
except on E: Exception do
begin
E.Message := ´Não foi possível determinar o espaço disponível em ´+sPath+1310´Detalhe: ´+E.Message;
raise
end
end;
if Result <= 0 then
raise Exception.Create(´Não foi possível determinar o espaço disponível em ´+sPath)
end;



GOSTEI 0
POSTAR