Перетащите папку из проводника Windows в listBox на С#

Мне удалось разработать код С# для перетаскивания файлов из обозревателя Windows в listBox.

    // Drag and Drop Files to Listbox
    private void listBox1_DragEnter(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.FileDrop, false))
            e.Effect = DragDropEffects.All;
        else
            e.Effect = DragDropEffects.None;
    }

    private void listBox1_DragDrop(object sender, DragEventArgs e)
    {
        string[] files = (string[])e.Data.GetData(DataFormats.FileDrop, false);
        foreach (string fileName in files)
        {
           listBox1.Items.Add(fileName);  
        }
    }

Если я перетащил папку в listBox, все файлы, которые находятся внутри папки, будут добавлены в элементы listBox.

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

Спасибо заранее.

Ответ 1

Ваш код для DragEnter по-прежнему применяется к папкам.

В событии DragDrop вы также получаете пути к файлам и папкам. Если вы перетаскиваете комбинации файлов и папок, все они будут отображаться в вашем массиве files. Вам просто нужно определить, являются ли пути папками или нет.

Следующий код будет извлекать все пути всех файлов из корня всех папок, удаленных, и пути всех файлов будут удалены.

    private void listBox1_DragDrop(object sender, DragEventArgs e)
    {
        List<string> filepaths = new List<string>();
        foreach (var s in (string[])e.Data.GetData(DataFormats.FileDrop, false))
        {
            if (Directory.Exists(s))
            {
                //Add files from folder
                filepaths.AddRange(Directory.GetFiles(s));
            }
            else
            {
                //Add filepath
                filepaths.Add(s);
            }
        }
    }

Обратите внимание, что будут собраны только файлы в корне папок папок. Если вам нужно получить все файлы в дереве папок, вам потребуется немного рекурсии, чтобы собрать их все.

Ответ 2

если fileName - это каталог, вы можете создать объект DirectoryInfo и пропустить все файлы (и поддиры)

вы можете посмотреть этот код:

http://weblogs.asp.net/israelio/archive/2004/06/23/162913.aspx

(вам не нужно использовать объект DirectoryInfo, вы также можете использовать статические методы из класса Directory