Return to Snippet

Revision: 55294
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