35 messaggi dal 27 febbraio 2004
Ciao a tutti,

io ho una cartella di rete condivisa \\MyServer\MyFolder, vorrei sapere quanto spazio libero ho sul disco in cui è situata la cartella.

Grazie
501 messaggi dal 09 giugno 2006
Contributi
Ciao.

Lo spazio disponibile è un'informazione associata al disco fisso e non alla directory (come tra l'altro tu stesso hai evidenziato). Ne consegue che per conoscere lo spazio disponibile nella directory "\\MyServer\MyFolder" devi per forza connettere un disco di rete (es. X: connesso a "\\MyServer\MyFolder"). A questo punto:

Dim afs As Long = New io.DriveInfo("X:").AvailableFreeSpace


Non mi risulta che dato il percorso UNC di una risorsa sia possibile conoscere direttamente lo spazio disponibile nel corrispondente disco fisso.

Ciao.

.:. Marcello Rutter .:.
35 messaggi dal 27 febbraio 2004
Ciao,

prima di tutto grazie della risposta.

Ho trovato un modo per sapere le informazioni sui dischi di un pc anche remoto con il WMI, ti posto il codice:
  
Dim diskClass As New System.Management.ManagementClass("\\MyServer\root\cimv2")
Dim disks As System.Management.ManagementObjectCollection = diskClass.GetInstances()
Dim disk As System.Management.ManagementObject
Dim sDriveInfo As String
For Each disk In disks
      sDriveInfo &= "Drive " + disk("Name").ToString() + " byte: " + disk("FreeSpace").ToString
Next disk



oppure
Dim ms As New System.Management.ManagementScope("\\MyServer\root\cimv2")
Dim oq As New Management.ObjectQuery("Select * From Win32_LogicalDisk")
Dim mos As New Management.ManagementObjectSearcher(ms, oq)
Dim moc As Management.ManagementObjectCollection = mos.Get()
Dim disk As System.Management.ManagementObject
Dim sDriveInfo As String
For Each disk In disks
      sDriveInfo &= "Drive " + disk("Name").ToString() + " byte: " + disk("FreeSpace").ToString


in sostanza puoi avere informazioni di qualsiasi tipo, anche a livello hardware,
gestite come un db, facendo la connessione al pc remoto e interrogandolo con una query.

Tutto testato e funzionante. Ora il mio problema è sapere a quale disco è associata la cartella condivisa.

Ciao
501 messaggi dal 09 giugno 2006
Contributi
Ciao.

Nella mia risposta non ho citato WMI perché non mi sembrava, dal tuo quesito, che fosse la direzione che intendevi prendere. Con WMI puoi ottenere queste e molte altre informazioni però non è così "gratuito" come sembra. Sorgono infatti alcuni problemi che dovresti valutare specialmente se la tua applicazione verrà distribuita a terzi: non è detto che WMI sia installato e/o attivo su qualsiasi server - molto spesso per ragioni di sicurezza i servizi WMI sono disattivati; l'accesso ai servizi WMI potrebbe richiedere diritti diversi da quelli necessari per l'accesso alla risorsa condivisa (diritti di cui il tuo processo potrebbe non disporre); alcuni software antivirus bloccano le richieste WMI.

Chiaramente non è detto che tu abbia di questi problemi a maggior ragione se il tutto gira in un contesto di rete locale sulla quale, magari, hai anche la possibilità di metterci mani dal punto di vista sistemistico.

Tornando al tuo post. Puoi enumerare le condivisioni nel server usando la classe WMI Win32_Share.

        Dim ms As New System.Management.ManagementScope("\\MyServer\root\cimv2")
        Dim oq As New Management.ObjectQuery("Select * From Win32_Share")
        Dim mos As New Management.ManagementObjectSearcher(ms, oq)
        Dim moc As Management.ManagementObjectCollection = mos.Get()
        Dim o As System.Management.ManagementObject
        Dim sDriveInfo As String = ""
        For Each o In moc
            Console.WriteLine("La condivisione: " & o("Name") & " corrisponde al percorso " & o("Path"))
        Next


Se vuoi puoi restringere la query WMI inserendo una clausola WHERE del tipo "WHERE Name = 'MyShareName'"

Ciao.

.:. Marcello Rutter .:.
35 messaggi dal 27 febbraio 2004
Ho risolto alla vecchia maniera, in sviluppo funziona e in teoria dovrebbe funzionare anche in produzione.


sPath = Directory.GetDirectoryRoot(sPath)

fso = CreateObject("Scripting.FileSystemObject")
drive = fso.GetDrive(sPath)
dFreeSpace = drive.AvailableSpace




Comunque grazie

Ciao
501 messaggi dal 09 giugno 2006
Contributi
Bene,

anche se in questo modo la tua applicazione è costretta ad interagire con COM (se proprio non è necessario, sviluppando in .NET si cerca di evitare di utilizzare oggetti COM). Inoltre resta il problema per alcuni (molti) antivirus: Scripting.FileSystemObject è uno degli oggetti più "tenuti sotto controllo" ...

Solo per informazione ti posto un articolo su The Code Project che illustra l'utilizzo di una classe C# (disponibile il sorgente) che tramite l'impiego delle API WNet native di Windows consente di eseguire il mapping di unità di rete:

http://www.codeproject.com/csharp/mapnetdrive.asp

Magari puoi trovare lo spunto per qualche altra soluzione "FileSystemObject" indipendente.

Ciao e buon lavoro.

P.S. Perdona se sottolineo alcuni particolari che magari esulano dalla programmazione fine a se stessa e magari a te non interessano: lo faccio solo per condividere le diverse esperienze.

.:. Marcello Rutter .:.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.