Как получить и отобразить все размеры файлов из массива файлов

Я новичок в программировании, в настоящее время пытаюсь получить все размеры файлов из массива файлов и отобразить рядом с ними. Я нашел решение FileInfo, но понятия не имел, как оно работает, и не смог найти никакого решения в Интернете. Массив файлов получен и успешно отображен до того, как я добавил строку FileInfo.

private void Button1_Click(object sender, EventArgs e)
{
    FolderBrowserDialog FBD = new FolderBrowserDialog();

    if (FBD.ShowDialog()==DialogResult.OK)
    {
        listBox1.Items.Clear();
        string[] files = Directory.GetFiles(FBD.SelectedPath);
        string[] dirs = Directory.GetDirectories(FBD.SelectedPath);


        foreach (string file in files)
        {
            long length = new FileInfo(FBD.SelectedPath).Length; //FileNotFoundException
            listBox1.Items.Add(Path.GetFileName(file + length));
        }

        foreach (string dir in dirs)
        {
            listBox1.Items.Add(Path.GetFileName(dir));
        }
    }  
}

У меня есть кнопка, которая может открыть диалоговое окно папки, и пользователь может выбрать каталог, а также список для отображения всех файлов / каталогов по выбранному пути. Могу ли я получить все размеры файлов по пути и отобразить их рядом с каталогом files /?


person Alois    schedule 11.09.2019    source источник


Ответы (2)


Не с Directory.GetFiles вы не можете - он возвращает массив строк, которые являются путями к файлам. Вам нужно будет создать новый FileInfo из каждого и получить его длину. Было бы лучше вызвать метод DirectoryInfo, который возвращает вам массив FileInfo для начала:

private void Button1_Click(object sender, EventArgs e)
{
    FolderBrowserDialog FBD = new FolderBrowserDialog();

    if (FBD.ShowDialog()==DialogResult.OK)
    {
        listBox1.Items.Clear();
        FileInfo[] files = new DirectoryInfo(FBD.SelectedPath).GetFiles();
        string[] dirs = Directory.GetDirectories(FBD.SelectedPath);


        foreach (FileInfo file in files)
        {
            listBox1.Items.Add(file.Name + "(" + file.Length + " bytes)");
        }

        foreach (string dir in dirs)
        {
            listBox1.Items.Add(Path.GetFileName(dir));
        }
    }  
}

Я не совсем понимаю, что вы имеете в виду под «Могу ли я получить все размеры файлов по пути и отобразить рядом с каталогом ..»

Каталоги не имеют размера файла; Вы имели в виду, что хотите получить сумму всех размеров файлов внутри каталога? Для всех подкаталогов в иерархии или только для верхнего каталога? Возможно что-то вроде этого:

private void Button1_Click(object sender, EventArgs e)
{
    FolderBrowserDialog FBD = new FolderBrowserDialog();

    if (FBD.ShowDialog()==DialogResult.OK)
    {
        listBox1.Items.Clear();
        FileInfo[] files = new DirectoryInfo(FBD.SelectedPath).GetFiles();
        DirectoryInfo[] dirs = new DirectoryInfo(FBD.SelectedPath).GetDirectories();


        foreach (FileInfo file in files)
        {
            listBox1.Items.Add(file.Name + "(" + file.Length + " bytes)");
        }

        foreach (DirectoryInfo dir in dirs)
        {
            listBox1.Items.Add(dir.Name + "(" + dir.GetFiles().Sum(f => f.Length) + " bytes)");
        }
    }  
}

Для работы Sum вам потребуется импортированный System.Linq.


Между прочим, я представляю следующее в качестве комментария о том, почему ваш код не работал:

private void Button1_Click(object sender, EventArgs e)
{
    FolderBrowserDialog FBD = new FolderBrowserDialog();

    if (FBD.ShowDialog()==DialogResult.OK)
    {
        listBox1.Items.Clear();
        string[] files = Directory.GetFiles(FBD.SelectedPath);
        string[] dirs = Directory.GetDirectories(FBD.SelectedPath);


        foreach (string file in files) //ok, so file is the filepath
        {
            //it doesn't work because you put "FBD.SelectedPath" in instead of "file" 
            // FBD.SelectedPath is a directory, not a file, hence the FileNotFoundException
            //But the real problem is probably a cut n paste error here
            long length = new FileInfo(FBD.SelectedPath).Length; 


            //it would work out but it's a weird way to do it, adding the length on before you strip the filename out
            //Path doesnt do anything complex, it just drops all the text before the 
            //last occurrence of /, but doing Path.GetFilename(file) + length would be better
            listBox1.Items.Add(Path.GetFileName(file + length)); 
        }

        foreach (string dir in dirs)
        {
            //need to be careful here: "C:\temp\" is a path of a directory but calling GetFilename on it would return "", not temp
            listBox1.Items.Add(Path.GetFileName(dir));
        }
    }  
}
person Caius Jard    schedule 11.09.2019
comment
Привет, Кай, я только что понял, что в каталоге нет размера файла, в этом случае я предпочитаю получать и отображать все файлы из подпапок, а не суммировать размеры файлов, знаете ли вы, как это сделать? следует ли мне использовать цикл для проверки наличия дочерней папки, а затем получить файл внутри? - person Alois; 11.09.2019
comment
Вы хотите заполнить свой список каждым файлом на диске в выбранной папке? то есть вы хотите перечислить все каталоги в выбранном и поместить каждый найденный файл в список вместе? Если да, изучите перегрузку DirectoryInfo.GetFiles (string, SearchOption) GetFiles: docs.microsoft.com/en-us/dotnet/api/ - person Caius Jard; 11.09.2019
comment
== ›Если вы измените строки FileInfo[] files = new DirectoryInfo(FBD.SelectedPath).GetFiles(); на FileInfo[] files = new DirectoryInfo(FBD.SelectedPath).GetFiles("*.*", SearchOption.AllDirectories);, вы получите намного больше файлов, но вам нужно будет что-то сделать, чтобы заполнить их частичные пути (возможно, подставить путь к файлу для всего после выбранной папки) или полные пути, чтобы их можно было различить. Такое ощущение, что вы не до конца определились, какие спецификации должна иметь эта программа;) - если вы можете решить, каким будет результат, на этот вопрос можно будет ответить. - person Caius Jard; 11.09.2019
comment
Понятно. Я выберу второй вариант: получить больше файлов и распечатать полный путь. Я попробовал ваше первое решение и изменил строку, как указано выше, но получаю сообщение об ошибке - listBox1.Items.Add (file.Name + (file.Length + bytes)); Он говорит, что нет перегрузки для метода Add, чтобы принимать 2 аргумента. - person Alois; 11.09.2019
comment
Я понял! Оно работает! это была синтаксическая ошибка, я добавил + перед file.length. Спасибо за руководство: D - person Alois; 11.09.2019
comment
Исправлена ​​опечатка в коде, спасибо, что сообщили мне - person Caius Jard; 11.09.2019

Вы почти все сделали правильно, попробуйте следующее:

private void Button1_Click(object sender, EventArgs e)
{
    FolderBrowserDialog folderBrowser = new FolderBrowserDialog();

    if (folderBrowser.ShowDialog() == DialogResult.OK)
    {
        listBox1.Items.Clear();
        string[] files = Directory.GetFiles(folderBrowser.SelectedPath);

        foreach (string file in files)
        {
            var fileInfo = new FileInfo(file);
            listBox1.Items.Add($"{Path.GetFileName(file)} {fileInfo.Length} bytes.");
        }
    }  
}
person Isma    schedule 11.09.2019
comment
привет работает! Но как насчет размера файла каталога? или есть способ отобразить весь файл из подпапки (если есть) - person Alois; 11.09.2019