Comment puis-je déterminer si un lecteur distant dispose de suffisamment d'espace pour écrire un fichier en C #?

StackOverflow https://stackoverflow.com/questions/137255

Question

Comment puis-je déterminer si un lecteur distant dispose de suffisamment d'espace pour télécharger un fichier donné à l'aide de C # dans .Net?

Était-ce utile?

La solution

Il existe deux solutions possibles.

  1. Appelez la fonction Win32 GetDiskFreeSpaceEx. Voici un exemple de programme:

    internal static class Win32
    {
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        internal static extern bool GetDiskFreeSpaceEx(string drive, out long freeBytesForUser, out long totalBytes, out long freeBytes);
    
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            long freeBytesForUser;
            long totalBytes;
            long freeBytes;
    
            if (Win32.GetDiskFreeSpaceEx(@"\\prime\cargohold", out freeBytesForUser, out totalBytes, out freeBytes)) {
                Console.WriteLine(freeBytesForUser);
                Console.WriteLine(totalBytes);
                Console.WriteLine(freeBytes);
            }
        }
    }
    
  2. Utilisez l'interface de gestion du système. Il y a une autre réponse dans ce post qui décrit cela. Cette méthode est vraiment conçue pour être utilisée dans des langages de script tels que PowerShell. Il effectue beaucoup de duvet juste pour obtenir le bon objet. En fin de compte, je suppose que cette méthode revient à appeler GetDiskFreeSpaceEx.

Toute personne effectuant un développement Windows sérieux en C # finira probablement par appeler de nombreuses fonctions Win32. Le framework .NET ne couvre tout simplement pas 100% de l'API Win32. Tout programme volumineux découvrira rapidement des lacunes dans les bibliothèques .NET uniquement disponibles via l'API Win32. Je voudrais obtenir l'un des wrappers Win32 pour .NET et l'inclure dans votre projet. Cela vous donnera un accès instantané à pratiquement toutes les API Win32.

Autres conseils

Utiliser WMI

using System.Management;

// Get all the network drives (drivetype=4)
SelectQuery query = new SelectQuery("select Name, VolumeName, FreeSpace from win32_logicaldisk where drivetype=4");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
foreach (ManagementObject drive in searcher.Get())
{
    string Name = (string)drive["Name"];
    string VolumeName = (string)drive["VolumeName"];
    UInt64 freeSpace = (UInt64)drive["FreeSpace"];
}

basé sur (volé à) http://www.dreamincode.net/code/snippet1576. htm

Parlez-vous du mappage d'un partage réseau sur un lecteur logique de votre ordinateur?

Si oui, vous pouvez utiliser DriveInfo.

    DriveInfo info = new DriveInfo("X:");

    info.AvailableFreeSpace;

DriveInfo fonctionne uniquement avec les lecteurs logiques. Par conséquent, si vous utilisez uniquement le nom de partage complet (UNC), le code ci-dessus ne fonctionnera pas.

Je ne sais pas si GetDiskFreeSpaceEx fonctionne sur les partages UNC, mais s'il l'utilise, sinon, voici comment monter un partage UNC sur un lecteur de journal:

MODIFIER GetDiskFreeSpaceEx fonctionne sur les partages UNC, utilisez-le ... Cependant, ce code demandait trop d'efforts pour être supprimé, et est pratique si vous souhaitez monter un partage UNC en tant que fichier local. conduire dans votre code.

public class DriveWrapper
{                    
    [StructLayout(LayoutKind.Sequential)]
    public struct NETRESOURCEA
    {
        public int dwScope;
        public int dwType;
        public int dwDisplayType;
        public int dwUsage;
        [MarshalAs(UnmanagedType.LPStr)]
        public string lpLocalName;
        [MarshalAs(UnmanagedType.LPStr)]
        public string lpRemoteName;
        [MarshalAs(UnmanagedType.LPStr)]
        public string lpComment;
        [MarshalAs(UnmanagedType.LPStr)]
        public string lpProvider;
        public override String ToString()
        {
            String str = "LocalName: " + lpLocalName + " RemoteName: " + lpRemoteName
                  + " Comment: " + lpComment + " lpProvider: " + lpProvider;
            return (str);
        }
    }

    [DllImport("mpr.dll")]
    public static extern int WNetAddConnection2A(
          [MarshalAs(UnmanagedType.LPArray)] NETRESOURCEA[] lpNetResource,
          [MarshalAs(UnmanagedType.LPStr)] string lpPassword,
          [MarshalAs(UnmanagedType.LPStr)] string UserName,
          int dwFlags);       
    [DllImport("mpr.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    private static extern int WNetCancelConnection2A(
          [MarshalAs(UnmanagedType.LPStr)]
        string lpName,
          int dwFlags,
          int fForce
          );

    public int GetDriveSpace(string shareName, string userName, string password)
    {
        NETRESOURCEA[] n = new NETRESOURCEA[1];
        n[0] = new NETRESOURCEA();

        n[0].dwScope = 0;
        n[0].dwType = 0;
        n[0].dwDisplayType = 0;
        n[0].dwUsage = 0;

        n[0].dwType = 1;

        n[0].lpLocalName = "x:";
        n[0].lpRemoteName = shareName;
        n[0].lpProvider = null;

        int res = WNetAddConnection2A(n, userName, password, 1);

        DriveInfo info = new DriveInfo("x:");
        int space = info.AvailableFreeSpace;

        int err = 0;
        err = WNetCancelConnection2A("x:", 0, 1);

        return space;
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top