2009-09-11 12 views
21

Potrzebuję sposobu, aby sprawdzić dostępne miejsce na dysku na serwerze Windowsprzed skopiowaniem plików na ten serwer. Za pomocą tej metody mogę sprawdzić, czy serwer główny jest pełny, a jeśli tak, to skopiuję pliki na serwer pomocniczy.Jak mogę sprawdzić dostępne miejsce na dysku?

Jak mogę sprawdzić dostępne miejsce na dysku za pomocą C#/ASP.net 2.0?

+0

Duplikat: http://stackoverflow.com/questions/56715/best-way-to-query-disk-space- on-remote-server –

Odpowiedz

30

Można to sprawdzić w następujący sposób:

dodać System.Management.dll jako odniesienie do projektu.

Użyj następującego kodu, aby uzyskać miejsca na dysku:

using System; 
using System.Management; 

public string GetFreeSpace(); 
{ 
    ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"c:\""); 
    disk.Get(); 
    string freespace = disk["FreeSpace"]; 
    return freespace; 
} 

Istnieje mnóstwo sposobów na to, by sprawdzić nazw System.Management innych sposobów.

Oto jeden z takich sposobów z tej strony:

public void GetDiskspace() 
    { 
     ConnectionOptions options = new ConnectionOptions(); 
     ManagementScope scope = new ManagementScope("\\\\localhost\\root\\cimv2", 
     options); 
     scope.Connect(); 
     ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_OperatingSystem"); 
     SelectQuery query1 = new SelectQuery("Select * from Win32_LogicalDisk"); 

     ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); 
     ManagementObjectCollection queryCollection = searcher.Get(); 
     ManagementObjectSearcher searcher1 = new ManagementObjectSearcher(scope, query1); 
     ManagementObjectCollection queryCollection1 = searcher1.Get(); 

     foreach (ManagementObject m in queryCollection) 
     { 
      // Display the remote computer information 

      Console.WriteLine("Computer Name : {0}", m["csname"]); 
      Console.WriteLine("Windows Directory : {0}", m["WindowsDirectory"]); 
      Console.WriteLine("Operating System: {0}", m["Caption"]); 
      Console.WriteLine("Version: {0}", m["Version"]); 
      Console.WriteLine("Manufacturer : {0}", m["Manufacturer"]); 
      Console.WriteLine(); 
     } 

     foreach (ManagementObject mo in queryCollection1) 
     { 
      // Display Logical Disks information 

     Console.WriteLine("    Disk Name : {0}", mo["Name"]); 
     Console.WriteLine("    Disk Size : {0}", mo["Size"]); 
     Console.WriteLine("    FreeSpace : {0}", mo["FreeSpace"]); 
     Console.WriteLine("   Disk DeviceID : {0}", mo["DeviceID"]); 
     Console.WriteLine("  Disk VolumeName : {0}", mo["VolumeName"]); 
     Console.WriteLine("  Disk SystemName : {0}", mo["SystemName"]); 
     Console.WriteLine("Disk VolumeSerialNumber : {0}", mo["VolumeSerialNumber"]); 
     Console.WriteLine(); 
     } 
     string line; 
     line = Console.ReadLine(); 
    } 
+0

Działa to na komputerze, który wykonuje kod, ale co z serwerem zdalnym? –

+0

Link, do którego Cię wysłałem, może Ci powiedzieć, jak; Nie zrobiłem tego; ale mogę opublikować kod, którego użyjesz do wysłania zapytania do serwera. –

+0

Ah w porządku, przegapiłem ManagementScope, to powinno dla mnie zadziałać. Wypróbuję to. –

5

Można użyć klasa DriveInfo

DriveInfo[] oDrvs = DriveInfo.GetDrives(); 
    foreach (var Drv in oDrvs) { 
     if (Drv.IsReady) { 
      Console.WriteLine(Drv.Name + " " + Drv.AvailableFreeSpace.ToString); 
     } 
} 
+0

To działa dla maszyny, która wykonuje kod, ale co z serwerem zdalnym? –

+0

Można zmapować dysk sieciowy, ale może być nieco skomplikowane programowo –

8

To wydaje się być opcja z System.IO:

DriveInfo c = new DriveInfo("C"); 
long cAvailableSpace = c.AvailableFreeSpace; 
16

przy użyciu tego kodu:

static void Main() 
    { 
     try 
     { 
      DriveInfo driveInfo = new DriveInfo(@"C:"); 
      long FreeSpace = driveInfo.AvailableFreeSpace; 
     } 
     catch (System.IO.IOException errorMesage) 
     { 
      Console.WriteLine(errorMesage); 
     } 

    } 

JEŻELI pojawia się błąd "Urządzenie nie jest gotowe" .i.e urządzenie nie jest gotowe. Jeśli spróbujesz tego kodu dla napędu CD bez płyty CD, otrzymasz ten sam błąd:)

+3

lub możesz po prostu użyć driveInfo.IsReady, aby sprawdzić, czy dysk jest gotowy, czy nie. –

Powiązane problemy