2009-05-12 7 views
4

Quelle est la meilleure façon .Net pour vous assurer un chemin que la capacité de stocker un fichier. Je dois m'assurer que j'ai la place pour le fichier avant que je télécharge est parce que la source ne permettra pas le fichier à télécharger une deuxième fois. J'ai regardé System.IO.DriveInfo mais cela ne fonctionne pas pour les chemins UNC.Quelle est la meilleure façon de vérifier la capacité du système de fichiers en utilisant .Net?

+0

Que diriez-vous d'un appel API au lieu de WMI? –

+0

@Matthew: Pourquoi préférez-vous API sur WMI? Il y a une solution extrêmement courte, et en utilisant le WMI, vous restez entièrement géré (en utilisant l'espace de noms System.Management). – Noldorin

+0

Je pense juste qu'un simple PInvoke serait mieux que de jouer dans WMI. Mais je suppose que WMI pourrait fonctionner. –

Répondre

5

Voici une courte fonction tirée de this page qui montre comment vous pouvez obtenir l'espace libre de n'importe quel lecteur (local ou réseau/UNC) en utilisant WMI.

private static ulong GetFreeDiskSpaceInBytes(string drive) 
{ 
    ManagementObject disk = 
     new ManagementObject("win32_logicaldisk.deviceid=\"" + drive + ":\""); 
    disk.Get(); 
    return (ulong)disk["FreeSpace"]; 
} 

Si vous WNAT une solution API Win32, vous pouvez utiliser la fonction GetDiskFreeSpaceEx, comme le suggère this MSDN help page. Il semble aussi prendre en charge les noms de lecteur local et réseau.

Private Declare Function GetDiskFreeSpaceEx Lib "kernel32" _ 
    Alias "GetDiskFreeSpaceExA" (ByVal lpDirectoryName As String, _ 
    lpFreeBytesAvailableToCaller As Currency, _ 
    lpTotalNumberOfBytes As Currency, _ 
    lpTotalNumberOfFreeBytes As Currency) As Long 

Private Sub Form_Click() 
    Dim Status As Long 
    Dim TotalBytes As Currency 
    Dim FreeBytes As Currency 
    Dim BytesAvailableToCaller As Currency 

    Status = GetDiskFreeSpaceEx(Text1.Text, BytesAvailableToCaller, _ 
     TotalBytes, FreeBytes) 
    If Status <> 0 Then 
     MsgBox Format(TotalBytes * 10000, "#,##0"), , "Total Bytes" 
     MsgBox Format(FreeBytes * 10000, "#,##0"), , "Free Bytes" 
     MsgBox Format(BytesAvailableToCaller * 10000, "#,##0"), , _ 
      "Bytes Available To Caller" 
    End If 
End Sub 

Si vous rencontrez des problèmes lors de la conversion en C#, faites le moi savoir.

je dois recommander ici la solution WMI, étant entièrement géré (en dehors de moins de lignes), mais non devrait faire l'affaire.

0

Je suis sûr que vous pourriez obtenir les réponses dont vous avez besoin à l'aide WMI, il est généralement un bon endroit pour commencer.

0

La seule façon de voir si le disque peut stocker le fichier est de créer en fait un fichier de cette taille sur le disque.

Même si les informations sur le disque indique que suffisant il y a place, en raison de Défragmentation vous pouvez rarement utiliser 100% de l'espace disque libre.

+0

Je pensais m'assurer que deux à trois fois les espaces nécessaires existent juste pour avoir une couverture supplémentaire. Mais merci pour la note –

Questions connexes