Revision: 55294
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at February 1, 2012 19:40 by crackiron
Initial Code
Imports System.IO
Imports System.Text.RegularExpressions
Module Module1
Sub Main()
'Ficheros necesarios para realizar la consulta
Dim tsmFiles() As String = {"dscenu.txt", "dsmc.exe", "dsmntapi.dll", "dsmw2k.dll", "tsmapi.dll", "tsmutil1.dll", "uncpaths.lst", "dsm.opt"}
'Función que detecta si los ficheros del Array existen
fileExists(tsmFiles)
'Definimos variables
Dim uncPaths() As String
Dim folderSizes() As Long
Dim i As Integer = 0
'Console.WriteLine("TSM Directory Query Backup v0.8b, jrLambea")
'Console.WriteLine("--------------------------------")
'Console.WriteLine("Recuerda que el fichero que contiene las rutas UNC a consultar es el uncpaths.lst.")
'Console.WriteLine("+ delante para subdirectorios.")
'Console.WriteLine()
'Recorremos el fichero de entrada con todas las rutas, las metemos en el array
uncPaths = getPaths("uncpaths.lst")
Try
'Por cada ruta del array ...
For Each var As String In uncPaths
'... revisamos si es una ruta UNC ("\\") absoluta ("$").
If Left(var, 2) = "\\" And InStr(var, "$", CompareMethod.Text) Then
'Ampliamos el array según recorremos los elementos
ReDim Preserve folderSizes(i)
'Actualitzem el fitxer dsm.opt
updateOpt(Split(var, "\")(2))
'Ejecutamos la consulta
folderSizes(i) = getSize(var)
'Sacamos la información por stdout
Console.WriteLine(var & ";" & folderSizes(i))
'+1! :D
i += 1
'... revisamos si es una ruta UNC ("\\") absoluta ("$") pero teniendo encuenta subdirectorios ("+").
ElseIf Left(var, 3) = "+\\" And InStr(var, "$", CompareMethod.Text) Then
'Dimensionamos el array que contendrá los subdirectorios
Dim subFolders() As String
'Informamos el directorio subfolder con los subdirectorios
subFolders = Directory.GetDirectories(Replace(var, "+", ""))
'Recorremos los subdirectorios ubicados en el array anterior
For Each dir As String In subFolders
'Ampliamos el array según recorremos los elementos
ReDim Preserve folderSizes(i)
'Ejecutamos la consulta
folderSizes(i) = getSize(dir)
'Sacamos la información por stdout
Console.WriteLine(dir & ";" & folderSizes(i))
'+1! :3
i += 1
Next
Else
'Si no cumple con las reglas anteriores el directorio es invalido.
Console.WriteLine("Directorio " & var & " invalido.")
End If
Next
'En caso de error ...
Catch ex As Exception
' ... muestra el error
MsgBox(ex.Message)
End Try
End Sub
Sub fileExists(ByVal sfile() As String)
'Por cada fichero del array sfile...
For Each var As String In sfile
' ... si no existe ...
If Not File.Exists(var) Then
' ... muestra el error de que no existe el fichero.
Console.WriteLine("Falta el fichero " & var & " para el correcto funcionamiento del programa.")
End
End If
Next
End Sub
Private Function getPaths(ByVal file As String) As String()
'Dimensionamos variables
Dim sr As New System.IO.StreamReader(file, System.Text.Encoding.Default)
Dim paths() As String = {""}
Dim i As String = 0
'Recorremos el fichero
While Not sr.EndOfStream
'Redimensionamos el array paths por cada ruta del array
ReDim Preserve paths(i)
'Añadimos lÃnea
paths(i) = sr.ReadLine
'+1 ò_Ó
i += 1
End While
'Cierra el fichero
sr.Close()
'Retorna un array con rutas
Return paths
End Function
Private Function getSize(ByVal path As String) As Long
'Dimensionamos las variables
Dim tempFile As String = Environment.GetEnvironmentVariable("temp") & "\" & Now.ToFileTime
Dim procStartInfo As New Process
procStartInfo.StartInfo.FileName = "dsmc.exe"
procStartInfo.StartInfo.Arguments = " query backup """ & path & "\*.*"" -subdir=yes "
procStartInfo.StartInfo.RedirectStandardOutput = True
procStartInfo.StartInfo.UseShellExecute = False
Dim sw As New StreamWriter(tempFile, False, System.Text.Encoding.Default)
Dim cadena, line As String
Dim blank_line As Integer
Dim bytes As Long = 0
procStartInfo.StartInfo.WindowStyle = ProcessWindowStyle.Minimized
procStartInfo.Start()
While blank_line < 5
line = procStartInfo.StandardOutput.ReadLine
If line = vbNullString Then blank_line += 1
sw.WriteLine(procStartInfo.StandardOutput.ReadLine)
End While
sw.WriteLine(procStartInfo.StandardOutput.ReadLine)
procStartInfo.WaitForExit()
sw.Close()
'Esperamos un segundo
System.Threading.Thread.Sleep(1000)
'Abrimos el fichero de salida del TSM
Dim sr As New StreamReader(tempFile)
'Recorremos el fichero
While Not sr.EndOfStream
'Informamos la variable con la lÃnea actual.
cadena = sr.ReadLine
'Revisem si a la lÃnea apareix algún tipus d'espai en bytes
If Regex.IsMatch(cadena, "[0-9] B", RegexOptions.None) Then
'Reemplacem tots els dobles espais per espais simples
While Regex.IsMatch(cadena, " ", RegexOptions.None)
cadena = Replace(cadena, " ", " ")
End While
'Eliminem espais sobrants a inici i final de lÃnea
cadena = Trim(Replace(cadena, ",", ""))
'Informem la variable bytes amb els bytes de la lÃnea.
bytes = bytes + Split(cadena, " ", -1, CompareMethod.Text)(0)
End If
End While
'Cerramos el fichero
sr.Close()
'Eliminamos el fichero
Kill(tempFile)
'Devolvemos el número de bytes
Return bytes
End Function
Private Sub updateOpt(ByVal server As String)
'Dimensionamos las variables
Dim sw As New StreamWriter("dsm.opt", False, System.Text.Encoding.Default)
sw.WriteLine("NODENAME " & server)
sw.WriteLine("PASSWORDACCESS GENERATE")
sw.WriteLine("TCPSERVERADDRESS XX.XX.XX.XX")
sw.WriteLine("ENCRYPTIONTYPE DES56")
sw.Close()
End Sub
End Module
Initial URL
http://www.eneseblog.com
Initial Description
Change XX.XX.XX.XX with your TSM Server IP
Initial Title
Know space occupied from a folder with a tsmquery
Initial Tags
Initial Language
VB.NET