Dateien zählen ohne Papierkorb-Inhalt

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Dateien zählen ohne Papierkorb-Inhalt

    moin, moin,

    mit folgender Abfrage erfasse ich derzeit den freien Speicherplatz auf bestimmten Rechnern im LAN (ja ich weiß, dass ist nicht die hohe Programmierkunst, aber ich kann nur "aus der Ferne" zugreifen, direkt auf den zu durchsuchenden Rechnern soll keine Anwendung dafür laufen)

    VB.NET-Quellcode

    1. Try
    2. For Each datei As FileInfo In New DirectoryInfo("\\192.0.0.0\laufwerk\suchordner").GetFiles("*", SearchOption.AllDirectories)
    3. no_freespace += datei.Length
    4. Next
    5. Dim freespace As Long = freespace_list(3, i) - no_freespace
    6. Catch ex As Exception
    7. Msgbox(ex.Message)
    8. End Try





    Das klappt aber nur dann, wenn ich einen beliebigen Ordner auf der Festplatte angebe. Möchte ich alle Ordner, (d.h. im root-Verzeichnis) durchsuchen und lasse den "Suchordner" weg, gibt es eine Exception "Der Zugriff auf den Pfad "\\192.0.0.0\laufwerk\RECYCLERS-1-5-21-1390067357-920026266-725345543-1003" wurde verweigert"

    VB.NET-Quellcode

    1. Try
    2. For Each datei As FileInfo In New DirectoryInfo("\\192.0.0.0\laufwerk").GetFiles("*", SearchOption.AllDirectories)
    3. no_freespace += datei.Length
    4. Next
    5. Dim freespace As Long = freespace_list(3, i) - no_freespace
    6. Catch ex As Exception
    7. Msgbox(ex.Message)
    8. End Try


    Da ich vermute, dass hier der Papierkorb gemeint ist: Wie kann man diesen ausschließen?

    For each Datei gibt's ein Dankeschön :P

    vom Vielfrager
    Mach ein Try-Catch rein (ist ja schon drin) und fang die Exception ab. Aber auch nur die, die beim Zugreifen entstehen können. Die ignorierst du dann. BTW: MessageBoxen sind eine sehr schlechte Fehlerbehandlung!
    Mit freundlichen Grüßen,
    Thunderbolt

    vielfrager schrieb:

    den freien Speicherplatz auf bestimmten Rechnern im LAN
    ... kann man schneller und mit wesentlich weniger Overhead über das System.Management-Objekt ermitteln.
    Beispiel:
    stackoverflow.com/questions/56…sk-space-on-remote-server
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Da gibt's sicher bessere Methoden, den belegten/freien Speicherplatz herauszufinden, als die gesamte Festplatte zu durchsuchen. Da wirst Du unweigerlich auch auf andere Ordner treffen, auf die Du keinen Zugriff hast.

    Ich hab jetzt mal nach ".net get free disk space" gegoogelt und die ersten 3 Ergebnisse sind StackOverflow. Da findet man meistens was.
    Da steht direkt beim ersten Ergebnis, noch im Startpost, was von DriveInfo.
    stackoverflow.com/questions/17…nd-free-disk-space-in-net
    Also schau mal im ObjectBrowser nach, was die DriveInfo-Klasse alles kann (findest Du unter System.IO).

    Edit: @timmi31061: Das ist nicht kein guter Ansatz. Übrigens müsste man das rekursiv machen und für jeden Ordner separat die Exception fangen (sonst werden nur ein paar Dateien gezählt, bis man zum Papierkorb kommt). Und sogar dann würde es noch nicht stimmen, weil man die Dateien in den geschützten Ordnern nicht zählen kann.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @timmi31061: Hoppla. Wollte zuerst schreiben "Das ist nicht der beste Ansatz". War mir dann aber zu wenig aussagekräftig und wollte es auf "Das ist kein guter Ansatz" ändern und hab dabei versehentlich das "nicht" stehen lassen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Moin, moin,

    die Messagebox war nur wegen der besseren Lesbarkeit drin. In der echten Anwendung wird an dieser Stelle ein errorlog geschrieben...

    Am Tipp aus stackoverflow (http://stackoverflow.com/questions/56715…n-remote-server) bin ich leider gescheitert:

    VB.NET-Quellcode

    1. Dim oConn As New ConnectionOptions 'es wird eine Änderung in Connectionstate verlangt
    2. Dim sNameSpace As String = "\\mnb-content2\root\cimv2"
    3. Dim oMS As New ManagementScope(sNameSpace, oConn) 'Der Typ Managementscope ist nicht definiert, weitere Fehlermeldung folgen
    4. Dim oQuery As System.Management.ObjectQuery = New System.Management.ObjectQuery("select FreeSpace,Size,Name from Win32_LogicalDisk where DriveType=3")
    5. Dim oSearcher As ManagementObjectSearcher = New ManagementObjectSearcher(oMS, oQuery)
    6. Dim oReturnCollection As ManagementObjectCollection = oSearcher.Get()
    7. Dim oReturn As ManagementObject
    8. For Each oReturn In oReturnCollection
    9. 'Disk name
    10. Console.WriteLine("Name : " + oReturn("Name").ToString())
    11. 'Free Space in bytes
    12. Dim sFreespace As String = oReturn("FreeSpace").ToString()
    13. If Left(oReturn("Name").ToString(), 1) = "Y" Then
    14. Console.WriteLine(sFreespace)
    15. End If
    16. Next


    Muss hier evtl. irgendwas importiert werden? Gut, dass ich die Frage im Grundlagenforum stelle :thumbsup:
    Du solltest schon einen Verweis auf die .NET Assembly System.Management hinzufügen und ManagementScope entweder durch vorangestelltes System.Management. ergänzen oder den Namespace System.Management importieren.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Hier habe ich jetzt mal die Funktion eingesetzt :
    Es muss allerdings folgender verweis gesetzt werden : System.Management
    den Verweise kann man wie folgt importieren : Project -> Eigenschaften -> Verweise -> Hinzufügen -> .Net -> System.Management -> ok -> in der Form oder in der Console den Import System.Management einsetzen

    Klasse :
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Network_Freespace
    2. Public OnlineDirectory As String
    3. Public Size As String
    4. Public harddrive As String
    5. Public Sub New(ByVal OnlineDirectory As String, harddrive As Char)
    6. Me.harddrive = harddrive
    7. Me.OnlineDirectory = OnlineDirectory
    8. Dim oQuery As System.Management.ObjectQuery = New System.Management.ObjectQuery("select FreeSpace,Size,Name from Win32_LogicalDisk where DriveType=3")
    9. Dim oSearcher As ManagementObjectSearcher = New ManagementObjectSearcher(New ManagementScope(OnlineDirectory, New ConnectionOptions()), oQuery)
    10. Dim oReturnCollection As ManagementObjectCollection = oSearcher.Get()
    11. For Each oReturn In oReturnCollection
    12. Dim rest As String = oReturn("Name").ToString()
    13. If rest.Length - 1 >= 0 Then If rest(0) = harddrive Then Size = oReturn("FreeSpace").ToString()
    14. Next
    15. End Sub
    16. End Class

    Aufruf :
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim net As New Network_Freespace("\\mnb-content2\root\cimv2", CChar("Y"))
    2. Console.WriteLine(net.Size)


    PS jupii 600 Posts
    MFG 0x426c61636b4e6574776f726b426974
    InOffical VB-Paradise IRC-Server
    webchat.freenode.net/
    Channel : ##vbparadise

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

    Bis hierhin erstmal Danke an alle!

    Ich habe nun mal den Vorschlag von BlackNetworkBit umgesetzt, der mit einer KLITZEKLEINEN :D Einschränkung funktioniert:
    Es werden die lokalen Laufwerke abgefragt, nicht die angegebene IP.

    Der Aufruf lautet

    VB.NET-Quellcode

    1. Dim net As New Network_Freespace("\\192.168.0.0", CChar("C"))
    2. 'Backslash nach der IP bekomme ich hier nicht angezeigt
    Ich habe wahrscheinlich eine Anfängerdenkblockade:

    Die Schreibweise

    VB.NET-Quellcode

    1. Dim net As New Network_Freespace("\\192.168.0.101\root\cimv2", CChar("C"))


    führt bei mir zu einer Exception "Der RPC-Server ist nicht verfügbar (Ausnahme von HRESULT: 0x800706BA).

    Habt noch ein bisschen Geduld mit mir bzgl der korrekten Syntax, bitte...
    Ich bin am Ende mit meinem Latein. RPC läuft laut Systemsteuerung.
    Bei der Abfrage net use \\192.168.0.101\rpc$ über die Eingabeaufforderung erhalte ich:

    Systemfehler 53 aufgetreten
    Der Netzwerkpfad wurde nicht gefunden

    DIe IP ist korrekt, per ping kann ich den Rechner ansprechen.

    Es wird mir wohl nichts übrig bleiben, als auf den zu überwachenden Rechnern ein Tool zu installieren, das selbständig den freien Speicherplatz meldet?!