Обнаружение общего и свободного пространства на диске в.NET

Я пытаюсь найти способ определить общее и доступное дисковое пространство в произвольной папке из приложения.NET. "Общим дисковым пространством" и "доступным дисковым пространством" в папке я обращаюсь к общему и доступному дисковому пространству, о котором сообщила бы эта папка, выполнили ли Вы команду "dir" на нем, то есть, общее и доступное дисковое пространство логического диска, содержащего ту папку, рассмотрев учетную запись пользователя, под которой выполняется запрос.

Я использую C#. Метод должен работать и на локальные и удаленные папки, данные как пути UNC (а не получил доступ через буквы сетевого диска). Например, это должно работать на:

  • C:\Temp
  • \\Silfen\Resources\Temp2

Я запускаю с объекта DirectoryInfo, но это, кажется, не имеет никакой связанной информации о дисковом пространстве. Класс DriveInfo делает, но он не будет работать с удаленными папками.

Править. После некоторых обменов с Вами парни я рассматриваю отображающиеся удаленные папки как локальные диски, с помощью DriveInfo для получения данных, и не отображаясь снова. Проблема с этим подходом состоит в том, что мое приложение должно собрать данные для более чем 120 папок несколько раз день каждый день. Я не уверен, что это было бы выполнимо.

Какие-либо идеи?Спасибо.

15
задан CesarGon 3 October 2019 в 17:21
поделиться

4 ответа

Как насчет этой ссылки из MSDN , которая использует класс System.IO.DriveInfo ?

12
ответ дан 1 December 2019 в 02:02
поделиться

System.IO.DriveInfo работает нормально. Я подключен к двум отдельным серверам Netware с несколькими подключенными дисками.

Вот для локального диска C::

Drive C:\
  File type: Fixed
  Volume label: Drive C
  File system: NTFS
  Available space to current user:   158558248960 bytes
  Total available space:             158558248960 bytes
  Total size of drive:               249884004352 bytes 

Вот результат для одного из сетевых дисков:

Drive F:\
  File type: Network
  Volume label: SYS
  File system: NWFS
  Available space to current user:     1840656384 bytes
  Total available space:               1840656384 bytes
  Total size of drive:                 4124475392 bytes 

Я использовал следующий код непосредственно из документации MSDN на DriveInfo:

using System;
using System.IO;

class Test
{
    public static void Main()
    {
        DriveInfo[] allDrives = DriveInfo.GetDrives();

        foreach (DriveInfo d in allDrives)
        {
            Console.WriteLine("Drive {0}", d.Name);
            Console.WriteLine("  File type: {0}", d.DriveType);
            if (d.IsReady == true)
            {
                Console.WriteLine("  Volume label: {0}", d.VolumeLabel);
                Console.WriteLine("  File system: {0}", d.DriveFormat);
                Console.WriteLine(
                    "  Available space to current user:{0, 15} bytes", 
                    d.AvailableFreeSpace);

                Console.WriteLine(
                    "  Total available space:          {0, 15} bytes",
                    d.TotalFreeSpace);

                Console.WriteLine(
                    "  Total size of drive:            {0, 15} bytes ",
                    d.TotalSize);
            }
        }
    }
}
1
ответ дан 1 December 2019 в 02:02
поделиться

Это может не то, что вам нужно, но я пытаюсь помочь, и у него есть бонус в виде слегка безопасного стирания свободного места на вашем диске.

public static string DriveSizeAvailable(string path)
{
    long count = 0;
    byte toWrite = 1;
    try
    {
        using (StreamWriter writer = new StreamWriter(path))
        {
            while (true)
            {
                writer.Write(toWrite);
                count++;
            }
        }
    }
    catch (IOException)
    {                
    }

    return string.Format("There used to be {0} bytes available on drive {1}.", count, path);
}

public static string DriveSizeTotal(string path)
{
    DeleteAllFiles(path);
    int sizeAvailable = GetAvailableSize(path);
    return string.Format("Drive {0} will hold a total of {1} bytes.", path, sizeAvailable);
}
3
ответ дан 1 December 2019 в 02:02
поделиться

Я почти уверен, что это невозможно. В проводнике Windows, если я попытаюсь получить свойства папки каталога UNC, это ничего не даст мне, насколько доступно доступное пространство. Используемое / доступное пространство - это характеристика дисков, а не папок, а общие ресурсы UNC рассматриваются как просто папки.

вам необходимо либо:
- Подключить диск
- Запустите что-нибудь на удаленном компьютере, чтобы проверить дисковое пространство.

Вы также можете столкнуться с проблемами с чем-то вроде распределенной файловой системы, в которой общий ресурс UNC / Mapped НЕ привязан к какому-либо конкретному диску, поэтому вам придется фактически суммировать до нескольких дисков.

А как насчет пользовательских квот? Диск может быть неполным, но учетная запись, которую вы используете для записи в эту папку, возможно, достигла своего предела.

0
ответ дан 1 December 2019 в 02:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: