Freien (Ordner-) Speicherplatz per SFTP ermitteln

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von dive26.

    Freien (Ordner-) Speicherplatz per SFTP ermitteln

    Hallo Leute,

    ich verwende die Komponente ComponentPro.SFTP um mit einem Gerät (Server) über SFTP zu kommunizieren.
    Dabei funktioniert der Download, der Upload, Directory-Listing etc. alles wie ich es möchte.

    Einzig den noch am Server zur verfügung stehende Speicherplatz konnte ich bis jetzt noch nicht ermitteln.

    Mit diesem Code lade ich eine Datei hoch (als Beispiel).

    VB.NET-Quellcode

    1. SFTPClient = New Sftp With {
    2. .Timeout = 1000,
    3. .ReconnectionMaxRetries = 2,
    4. .ReconnectionFailureDelay = 5000
    5. }
    6. SFTPClient.Connect("10.99.0.1", 22)
    7. SFTPClient.Authenticate("root", "password")
    8. SFTPClient.UploadFile("c:/testdatei.conf", "/home/root/.config/folder/festfile.conf")
    9. SFTPClient.Disconnect()


    Mit diesem Code lade ich z.B. den Inhalt eines Ordners (hier mit Wildcard nur .pdf Dateien) herunter:

    VB.NET-Quellcode

    1. SFTPClient.Download(remoteDirectory, localDirectory, "*.pdf")


    Hat jemand von Euch mit dieser Komponente erfahrung und weis wie man den noch zur Verfügung stehenden Speicherplatz ermitteln kann?

    Im Netz habe ich, unabhängig von dieser Komponente, nur folgenden Hinweis gefunden: sftp> df -h

    *Topic verschoben*
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Ich hab kurz die Doku gecheckt: Get directory size

    C#-Quellcode

    1. using System;
    2. using ComponentPro.Net;
    3. using ComponentPro.IO;
    4. ...
    5. void CalculateDirSize()
    6. {
    7. // Create a new class instance.
    8. Sftp client = new Sftp();
    9. // Connect to the SFTP server.
    10. client.Connect("myserver");
    11. // Authenticate.
    12. client.Authenticate("userName", "password");
    13. // ...
    14. // Calculate total size of an entire directory.
    15. long totalSize = client.GetDirectorySize("/myFolder", true, null);
    16. Console.WriteLine("Calculate total size for all files: " + FormatSize(totalSize));
    17. // Calculate total size for files with extension .dat.
    @slice

    ch hab kurz die Doku gecheckt: Get directory size


    Das habe ich auch schon gefunden, nützt mir aber leider nichts.
    client.GetDirectorySize gibt nur den "belegten" Speicherplatz für den angegebenen Ordner zurück, nicht aber den noch verfügbaren.
    Leider ist der verfügbare Speicherplatz des Gerätes je nach Firmware-Version und anderen Daten unterschiedlich hoch.

    Die SFTP-Komponente bringt mir aktuell nur einen Fehler "Failure, Failure" zurück, sobald der Speicher im Ordner nicht ausreicht.
    Ich würde aber gerne vor dem Upload prüfen, ob die Daten am Gerät auch wirklich noch Platz haben und dem User VOR dem Upload entsprechende Infos ausgeben.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Mist, da habe ich nicht aufgepasst :( Sorry
    Hab die Doku noch etwas durch sucht, konnte aber nichts passendes finden.
    Eventuell wäre es das besten den Hersteller mal direkt anzuschreiben und nach zu fragen?
    Über diesen SFTP-Client wirst du den verfügbaren Speicher vermutlich nicht rausfinden können.
    Eine Idee wäre zu dem Server eine SSH-Shell aufzubauen und den Speicherplatz über den entsprechenden Unix-Befehl zu ermitteln.
    Früher gab es auch mal FTP Clients, die Befehle wie SendCommand oder EXEC im Wortschatz hatten, aber ich vermute, dass die wenigsten SFTP-Server das unterstützen.
    Das hat ja auch etwas mit Sicherheit zu tun.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Eventuell wäre es das besten den Hersteller mal direkt anzuschreiben und nach zu fragen?

    Ja, hab ich schon. Aber man weis ja, je teurer eine Komponente ist, deste schlechter der Support ;-). Hab bis jetzt noch keine Antwort erhalten.

    Eine Idee wäre zu dem Server eine SSH-Shell aufzubauen und den Speicherplatz über den entsprechenden Unix-Befehl zu ermitteln.

    Den Hinweis sftp> df -h konnte ich schon mehrmals im Netz finden, kann aber damit nichts anfangen. Ist aber wohl etwas über die Kommandozeile ...

    Nachtrag: GELÖST!!!
    Dank eines älteren Beitrages über SSH hier im Forum konnte ich an den gewünschten Wert kommen. Hier mein Code:
    cmd.result übergibt alles was Ihr im Screenshot sehen könnt.
    Mit Stringoperationen angle ich mir den Wert aus der 2. Zeile und 4. Spalte raus.
    Die Stringoperationen sind etwas umfangreich - könnte man das auch irgendwie kürzer lösen? Falls ja, dann freue ich mich über Eure Vorschläge.

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Ermittelt den freien Speicher von /dev/root
    3. ''' </summary>
    4. ''' <returns></returns>
    5. Public Function ErmittleFreienSpeicherplatzAufDemGeraet() As Double
    6. Try
    7. Dim connInfo As New Renci.SshNet.PasswordConnectionInfo(My.Settings.ip, "root", HierDasPasswort)
    8. Dim sshClient As New Renci.SshNet.SshClient(connInfo)
    9. Dim cmd As Renci.SshNet.SshCommand
    10. sshClient.Connect()
    11. cmd = sshClient.RunCommand("df -h") 'listet alle remoteFolders mit Name, Size, Used, Available, Use% und Mounted on
    12. sshClient.Disconnect()
    13. 'gesuchert wert in 2. Zeile, 4. Spalte
    14. Dim lines As String() = cmd.Result.Split(vbLf.ToCharArray)
    15. 'lässt nur noch 1 Leerzeichen zwischen den Spalten übrig
    16. Dim SecondLine As String = lines(1)
    17. For i As Integer = 0 To 10
    18. SecondLine = SecondLine.Replace(" ", " ")
    19. Next i
    20. Dim Spalten As String() = SecondLine.Split(" ".ToCharArray)
    21. Spalten(3) = Spalten(3).Replace("M", "") 'M für Megabyte entfernen
    22. Spalten(3) = Spalten(3).Replace(".", ",") 'Punkt in Komma umwandeln
    23. Return CDbl(Spalten(3))
    24. Catch exc As Exception
    25. Return -1
    26. End Try
    27. End Function
    Bilder
    • 30122021170404.jpg

      72,6 kB, 382×250, 56 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „dive26“ ()

    @petaod

    Mittlerweile habe ich auch einen Hinweis vom Hersteller der Componente enthalten und konnte es auch mit der ComponentPRO Komponente umsetzen:

    VB.NET-Quellcode

    1. Imports ComponentPro
    2. Imports ComponentPro.Net
    3. Imports ComponentPro.IO
    4. ''' <summary>
    5. ''' Ermittelt den freien Speicher von /dev/root mit der Component PRO Komponente
    6. ''' </summary>
    7. ''' <returns></returns>
    8. Public Function ErmittleFreienSpeicherplatzAufreMarkable() As Double
    9. Try
    10. SFTPClient = New Sftp With {
    11. .Timeout = 1000,
    12. .ReconnectionMaxRetries = 2,
    13. .ReconnectionFailureDelay = 5000
    14. }
    15. SFTPClient.Connect(My.Settings.ip, 22)
    16. SFTPClient.Authenticate("root", My.Settings.password)
    17. Dim sshChannel As SecureShellChannel = SFTPClient.Connection.OpenSession()
    18. sshChannel.RequestExec("df -h")
    19. Dim response As New StringBuilder()
    20. Dim buffer(4095) As Byte
    21. Do
    22. Dim n As Integer = sshChannel.Receive(buffer, 0, buffer.Length)
    23. If n = 0 Then
    24. sshChannel.Close()
    25. Exit Do
    26. End If
    27. response.Append(Encoding.Default.GetString(buffer, 0, n))
    28. Loop
    29. SFTPClient.Disconnect()
    30. 'gesuchert wert in 2. Zeile, 4. Spalte
    31. Dim lines As String() = response.ToString.Split(vbLf.ToCharArray)
    32. 'lässt nur noch 1 Leerzeichen zwischen den Spalten übrig
    33. Dim SecondLine As String = lines(1)
    34. For i As Integer = 0 To 10
    35. SecondLine = SecondLine.Replace(" ", " ")
    36. Next i
    37. Dim Spalten As String() = SecondLine.Split(" ".ToCharArray)
    38. Spalten(3) = Spalten(3).Replace("M", "") 'M für Megabyte entfernen
    39. Spalten(3) = Spalten(3).Replace(".", ",") 'Punkt in Komma umwandeln
    40. Return CDbl(Spalten(3))
    41. Catch exc As Exception
    42. Return -1
    43. End Try
    44. End Function

    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at