2013-01-22 16 views
13

Eventuali duplicati:
Programmatically determining space available from UNC Pathottenere spazio libero su disco disponibile per un determinato percorso su Windows

Sto cercando di trovare una funzione che posso chiamare da C# per recuperare le informazioni . Questo è quello che ho provato finora:

String folder = "z:\myfolder"; // It works 
folder = "\\mycomputer\myfolder"; // It doesn't work 

System.IO.DriveInfo drive = new System.IO.DriveInfo(folder); 
System.IO.DriveInfo a = new System.IO.DriveInfo(drive.Name); 
long HDPercentageUsed = 100 - (100 * a.AvailableFreeSpace/a.TotalSize); 

Questo funziona bene, ma solo se mi passa una lettera di unità. C'è un modo per recuperare lo spazio libero passando un intero percorso?

Grazie.

+0

un'occhiata a [questo] (http://stackoverflow.com/questions/2965729/how-to-get-network-drive-size-in- c-sharp-senza-map-drive). risposta di Mitch Wheat * Credo che sarà necessario chiamare GetDiskFreeSpace (API Win32) tramite P/Invoke per ottenere lo spazio libero su disco di un'unità di rete UNC. * [C# GetDiskFreeSpace UNC] (http://www.sergey.co. uk/ShowThread.aspx? ID = 4563 & AspxAutoDetectCookieSupport = 1) –

risposta

24

tenta di utilizzare la funzione di WinAPI GetDiskFreeSpaceEx:

[DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool GetDiskFreeSpaceEx(string lpDirectoryName, 
    out ulong lpFreeBytesAvailable, 
    out ulong lpTotalNumberOfBytes, 
    out ulong lpTotalNumberOfFreeBytes); 

ulong FreeBytesAvailable; 
ulong TotalNumberOfBytes; 
ulong TotalNumberOfFreeBytes; 

bool success = GetDiskFreeSpaceEx(@"\\mycomputer\myfolder", 
            out FreeBytesAvailable, 
            out TotalNumberOfBytes, 
            out TotalNumberOfFreeBytes); 
if(!success) 
    throw new System.ComponentModel.Win32Exception(); 

Console.WriteLine("Free Bytes Available:  {0,15:D}", FreeBytesAvailable); 
Console.WriteLine("Total Number Of Bytes:  {0,15:D}", TotalNumberOfBytes); 
Console.WriteLine("Total Number Of FreeBytes: {0,15:D}", TotalNumberOfFreeBytes); 
+0

Grazie, sembra funzionare! – LEM

+0

Questo non funzionava finché non mi sono imbattuto in "C: \\" 'success = GetDiskFreeSpaceEx (" C: \\ ", fuori FreeBytesAvailable, ...' –

+1

@ J.Chris hai perso il segno @ prima del prima citazione, che rende obsoleto il mascheramento – rekire

Problemi correlati