none
Размер папки C# RRS feed

  • Вопрос

  • Возможно ли средствами самой операционной системы windows определить размер папок? Пробовал рекурсивно запускать метод подсчета суммы размеров вложенных папок, но при большом количестве вложений и большой глубине процесс занимает время. пробовал запускать рекурсию для папок в отдельном потоке, но особого эффекта не получил. Также пробовал упомянутый в Пустые папки и подпапки в программахWindowsFormsApplication на языке C# метод 

    GetFiles(
    	string path,
    	string searchPattern,
    	SearchOption searchOption)

    но возникают проблемы, если на указанном пути попадается закрытая папка (без доступа).

    P.S.

    Существуют ли другие методы узнать размер папки?

    18 февраля 2013 г. 13:54

Ответы

  • можно попробовать вот так

    float folderSize = 0.0f;
    FileInfo[] files = Directory.GetFiles(folder, "*", SearchOptions.AllDirectories);
    foreach(FileInfo file in files) folderSize += file.Length;

    можно попробовать через Windows script host

    public double GetWSHFolderSize(string Fldr)
        {
          //Reference "Windows Script Host Object Model" on the COM tab.
          IWshRuntimeLibrary.FileSystemObject FSO = new IWshRuntimeLibrary.FileSystemObject();
          double FldrSize = (double)FSO.GetFolder(Fldr).Size;
          Marshal.FinalReleaseComObject(FSO);
          return FldrSize;
        }

    • Помечено в качестве ответа Abolmasov Dmitry 21 февраля 2013 г. 6:56
    18 февраля 2013 г. 18:42
  • Собственно рекурсивный обход с отловом ошибок, на случай "запретных" папок это и есть способ системы. Если вы откроете окно "Свойство" крупной папки, то увидите, что размер и количество элементов папки как бы просчитываются и потом появляется итоговый результат. Причем время прасчета зависет не от размера а от количества файлов. Есть у меня на работе папка с тыщ 500 файлов на разных уровнях, так система размер там минуты полторы просчитывает. Ну а что бы программа не висла просчет нужно делать в отдельном потоке.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Предложено в качестве ответа Алексей ЛосевEditor 19 февраля 2013 г. 6:37
    • Помечено в качестве ответа Abolmasov Dmitry 21 февраля 2013 г. 6:56
    • Снята пометка об ответе Dobrii 21 мая 2013 г. 12:43
    • Помечено в качестве ответа Dobrii 21 мая 2013 г. 12:43
    18 февраля 2013 г. 18:52
    Отвечающий

Все ответы

  • можно попробовать вот так

    float folderSize = 0.0f;
    FileInfo[] files = Directory.GetFiles(folder, "*", SearchOptions.AllDirectories);
    foreach(FileInfo file in files) folderSize += file.Length;

    можно попробовать через Windows script host

    public double GetWSHFolderSize(string Fldr)
        {
          //Reference "Windows Script Host Object Model" on the COM tab.
          IWshRuntimeLibrary.FileSystemObject FSO = new IWshRuntimeLibrary.FileSystemObject();
          double FldrSize = (double)FSO.GetFolder(Fldr).Size;
          Marshal.FinalReleaseComObject(FSO);
          return FldrSize;
        }

    • Помечено в качестве ответа Abolmasov Dmitry 21 февраля 2013 г. 6:56
    18 февраля 2013 г. 18:42
  • Собственно рекурсивный обход с отловом ошибок, на случай "запретных" папок это и есть способ системы. Если вы откроете окно "Свойство" крупной папки, то увидите, что размер и количество элементов папки как бы просчитываются и потом появляется итоговый результат. Причем время прасчета зависет не от размера а от количества файлов. Есть у меня на работе папка с тыщ 500 файлов на разных уровнях, так система размер там минуты полторы просчитывает. Ну а что бы программа не висла просчет нужно делать в отдельном потоке.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Предложено в качестве ответа Алексей ЛосевEditor 19 февраля 2013 г. 6:37
    • Помечено в качестве ответа Abolmasov Dmitry 21 февраля 2013 г. 6:56
    • Снята пометка об ответе Dobrii 21 мая 2013 г. 12:43
    • Помечено в качестве ответа Dobrii 21 мая 2013 г. 12:43
    18 февраля 2013 г. 18:52
    Отвечающий
  • при использовании
    public double GetWSHFolderSize(string Fldr)
    ghb gjgfsnt узнать размер папки Program Files, Users, Windows выпадает исключение Exception from HRESULT: 0x800A0046 (CTL_E_PERMISSIONDENIED)
    20 февраля 2013 г. 6:29
  • Запуск программы от имени администратора?
    20 февраля 2013 г. 11:53
  • Видимо у вас программа работает с ограниченными правами а не имеет доступа к каталогам, если вам необходимы данные именно из этих каталогов то попробуйте запустить программу из-под пользователя у которого есть права на доступ к этим каталогам,
    20 февраля 2013 г. 16:55
  • Есть замечательное свойство у папок в корзине. они знают свой размер. 

    Folder recycleBin = shell.NameSpace(10);
    foreach (FolderItem2 f in recycleBin.Items())
    {
        string size = recycleBin.GetDetailsOf(f, 3);
    }

    Меня интересует вопрос: "Почему нельзя так же сделать для обычных каталогов?" (Существует ли такая возможность для обычных каталогов, ведь каталог в корзине по сути обычный каталог, его можно открыть, посмотреть, пройти по всем файлам)

  • Есть замечательное свойство у папок в корзине. они знают свой размер. 

    Folder recycleBin = shell.NameSpace(10);
    foreach (FolderItem2 f in recycleBin.Items())
    {
        string size = recycleBin.GetDetailsOf(f, 3);
    }

    Меня интересует вопрос: "Почему нельзя так же сделать для обычных каталогов?" (Существует ли такая возможность для обычных каталогов, ведь каталог в корзине по сути обычный каталог, его можно открыть, посмотреть, пройти по всем файлам)

    На самом деле удаление в корзину это дело абстрактное. Удаленные папки и файлы перемещаются в скрытую папку на диске, а заходя в "Корзину" вы видите ярлыки которые описывают, то что удалялось, поэтому там у папки стоит размер. Он просто был просчитан при удалении и записан в значение ярлыка.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    Отвечающий