Посмотреть AvailableFreeSpace дисков через IP-адрес

Я знаю, что AvailableFreeSpace можно использовать для локальных дисков, таких как "C:/", "D:/" и т. Д. Он также работает на сетевых дисках.

Но теперь мой вопрос:

Можно ли просмотреть AvailableFreeSpace "Папка" на другом IP? Я подключаюсь к локальным дискам с помощью этого кода:

System.IO.DriveInfo _DriveInfo = new DriveInfo(SaveLocation);

Когда "SaveLocation" является локальным диском типа "C:\Temp\Folder", тогда он работает нормально.

Но когда внутри "SaveLocation" есть IP-адрес, он не работает. В этом случае SaveLocation выглядит так: "192.168.200.10\c\Data"

Это не работает, и это причина моего вопроса. Сообщение об исключении: {"Объект должен быть корневым каталогом (\"C:\\") или буквой диска (\"C\")."}

Я надеюсь, что вы можете мне помочь.

1 ответ

Решение

Как видно в разделе Получить доступное дисковое пространство для заданного пути в Windows:

Используйте функцию winapi GetDiskFreeSpaceEx определить свободное место на UNC (сетевом) пути. Например, создайте новый проект VS под названием FreeSpace и вставьте его как Program.cs:

    using System;
    using System.Runtime.InteropServices;

    namespace FreeSpace
    {
        class Program
        {
            [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);

            static void Main(string[] args)
            {
                ulong FreeBytesAvailable;
                ulong TotalNumberOfBytes;
                ulong TotalNumberOfFreeBytes;

                bool success = GetDiskFreeSpaceEx(@"\\NETSHARE\folder",
                                              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);
                Console.ReadKey();
            }
        }
    }

Как вы можете видеть, это тот же код, что и в вопросе, связанном выше, только с учётом класса и правильного using директивы для компиляции без ошибок. Все кредиты идут на rekire

WMI, похоже, не обрабатывает свободное место на сетевых ресурсах. Но для локальных дисков лучше использовать интерфейс управления Windows: https://msdn.microsoft.com/en-us/library/aa394592(v=vs.85).aspx

Другие вопросы по тегам