No vídeo de hoje, vamos demonstrar em como buscar o espaço disponível no sistema operacional (Windows).
A dúvida de hoje, nos perguntaram, se seria possível buscar o espaço disponível em GBs de uma unidade do Windows, para meio que agendar alguma rotina que disparasse um eMail quando tivesse baixo.
Pensando nisso, montamos um exemplo, onde vamos demonstrar em como criar um arquivo Batch que busca o espaço disponível onde nós podemos criar nossa lógica em AdvPL ou TLPP.
Segue abaixo o vídeo exemplificando:
E abaixo o código fonte desenvolvido:
//Bibliotecas #Include "tlpp-core.th" //Declaração da namespace Namespace custom.terminal.youtube #Define CRLF Chr(13) + Chr(10) //Carriage Return Line Feed /*/{Protheus.doc} User Function diskSpace Função que valida o espaço disponível no disco rígido @type Function @author Atilio @since 10/05/2024 @param cWindowsDiskDrive, Caractere, Letra do Drive do Windows (se não vier nada vai considerar C) @return aAvailableSpace, Array, Posições [1] = Espaço total em bytes; [2] = Espaço em GBs; @obs Foi usado como referência esse link - https://stackoverflow.com/questions/293780/free-space-in-a-cmd-shell @example aEspaco := custom.terminal.youtube.u_diskSpace() Alert(aEspaco[2]) /*/ User Function diskSpace(cWindowsDiskDrive) Local aArea := FWGetArea() As Array Local aAvailableSpace := {0, 0} As Array Local cTempPath := GetTempPath() As Character Local cBatchFile := "busca_espaco.bat" As Character Local cResultFile := "espaco.txt" As Character Local cMSDosCommand := "" As Character Local cResultContent := "" As Character Local nTotalSpace := 0 As Numeric Local nSpaceInGBs := 0 As Numeric Local nConversionFactorGBs := 0 As Numeric Default cWindowsDiskDrive := "C" //Se o batch já existir, apaga ele If File(cTempPath + cBatchFile) FErase(cTempPath + cBatchFile) EndIf //Aciona o comando para buscar o espaço disponível no disco e gera um arquivo de resultado // Exemplo do comando completo: // wmic /node:"%COMPUTERNAME%" LogicalDisk Where DriveType="3" Get DeviceID,FreeSpace|find /I "C:" > "C:\Users\danat\AppData\Local\Temp\lista_arq.txt" cMSDosCommand := 'wmic /node:"%COMPUTERNAME%" LogicalDisk Where DriveType="3" Get DeviceID,FreeSpace|find /I "' + cWindowsDiskDrive + ':" > "' + cTempPath + cResultFile + '"' MemoWrite(cTempPath + cBatchFile, cMSDosCommand) //Agora executa o bat para gerar o arquivo ShellExecute("OPEN", cTempPath + cBatchFile, "", cTempPath, 0 ) //Aguarda 5 segundos Sleep(5000) //Se conseguiu gerar o arquivo temporário If File(cTempPath + cResultFile) //Le todo o arquivo cResultContent := MemoRead(cTempPath + cResultFile) //Pega do primeiro espaço em branco em diante cResultContent := SubStr(cResultContent, At(" ", cResultContent)) //Agora tira todos os espaços e converte para numérico cResultContent := Alltrim(cResultContent) nTotalSpace := Val(cResultContent) //Converte em GB nConversionFactorGBs := 1073741824 // 1.073.741.824 nSpaceInGBs := Round(nTotalSpace / nConversionFactorGBs, 2) //Define o retorno aAvailableSpace[1] := nTotalSpace aAvailableSpace[2] := nSpaceInGBs EndIf FWRestArea(aArea) Return aAvailableSpace /*/{Protheus.doc} User Function video0155 Função de exemplo para acionar a diskSpace @type Function @author Atilio @since 22/05/2024 @example custom.terminal.youtube.u_video0155() /*/ User Function video0155() Local aArea := FWGetArea() As Array Local cWindowsDiskDrive := "" As Character Local aSpaceInDisk := {} As Array Local cMessage := "" As Character Local cMask := "@E 999,999,999,999,999" As Character //Busca a unidade do Windows cWindowsDiskDrive := FWInputBox("Informe a unidade a ser avalida (exemplos: C, D, E, etc)") //Se o usuário informou uma unidade If ! Empty(cWindowsDiskDrive) //Força a pegar somente a primeira letra, caso houve alguma falha na digitação cWindowsDiskDrive := Upper(Left(cWindowsDiskDrive, 1)) //Agora vamos acionar a função para calcular o espaço disponível aSpaceInDisk := custom.terminal.youtube.u_diskSpace(cWindowsDiskDrive) //Por fim, será montado a mensagem e em seguida exibir ela cMessage := "Espaço livre total (bytes): " + Transform(aSpaceInDisk[1], cMask) + CRLF cMessage += "Espaço livre em GBs: " + Transform(aSpaceInDisk[2], cMask) + CRLF ShowLog(cMessage) EndIf FWRestArea(aArea) Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.