Как использовать DirectoryInfo для заполнения списка

В настоящее время я пытаюсь просмотреть каталог, чтобы найти файлы .jpg и отобразить результаты в списке. Затем, когда я это сделал, я хотел бы выбрать изображение и отобразить его в окне изображения.

Это код, который у меня есть:

    private void Form1_load(object sender, EventArgs e)
    {
        string filepath = "F:\\Apps Development\\Coursework\\3_Coursework\\3_Coursework\\bin\\Debug\\Pics";
        DirectoryInfo dirinfo = new DirectoryInfo(filepath);
        FileInfo[] images = dirinfo.GetFiles("*.jpg");
        foreach (FileInfo image in images) 
        {  
            lstImages.Items.Add(image.Name);
        }
    }

    private void lstImages_SelectedIndexChanged(object sender, EventArgs e)
    {
        string filepath = "F:\\Apps Development\\Coursework\\3_Coursework\\3_Coursework\\bin\\Debug\\Pics";
        pictureBox1.ImageLocation = filepath + lstImages.SelectedItem.ToString();
        pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;
        pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize;
    }

Кажется, это должно сработать. Но он не заполняет список тем, что я хотел бы. Любые идеи?


person Mark Lockhart    schedule 30.10.2013    source источник
comment
Запустите его в отладчике и убедитесь, что GetFiles возвращает непустой массив.   -  person D Stanley    schedule 30.10.2013
comment
Просто используйте отладчик :\ GetFiles действительно что-то возвращает? У вас вообще есть что-нибудь в этом каталоге в формате jpg?   -  person tnw    schedule 30.10.2013
comment
путь к файлу + @\ + lstImages.SelectedItem.ToString(); ИЛИ путь к файлу = F:\\Apps Development\\Coursework\\3_Coursework\\3_Coursework\\bin\\Debug\\Pics\\;   -  person varocarbas    schedule 30.10.2013
comment
все файлы в этом каталоге имеют формат .jpg. Я протестировал этот код в консольном приложении с помощью: Console.WriteLine(image.Name); и это возвращает имена файлов   -  person Mark Lockhart    schedule 30.10.2013
comment
?! Я так плохо доношу такую ​​простую мысль? СКАСНАЯ ЧАСТЬ ОТСУТСТВУЕТ, это путь, который вы рассматриваете: F:\Apps Development\Coursework\3_Coursework\3_Coursework\bin\Debug\Picspic1.jpg вместо: F:\Apps Development\Coursework\3_Coursework\3_Coursework\bin\Debug \Pics\pic1.jpg   -  person varocarbas    schedule 30.10.2013


Ответы (3)


Попробуйте это:

//load all image here
public Form1()
{
    InitializeComponent();
    //set your directory
    DirectoryInfo myDirectory = new DirectoryInfo(@"E:\MyImages");
    //set file type
    FileInfo[] allFiles = myDirectory.GetFiles("*.jpg");
    //loop through all files with that file type and add it to listBox
    foreach (FileInfo file in allFiles)
    {
            listBox1.Items.Add(file);
    }
}

//bind clicked image with picturebox
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    //Make selected item an image object
    Image clickedImage = Image.FromFile(@"E:\MyImages\" + listBox1.SelectedItem.ToString());
    pictureBox1.Image = clickedImage;
    pictureBox1.Height = clickedImage.Height;
    pictureBox1.Width = clickedImage.Width;
}
person Md. Ashaduzzaman    schedule 30.10.2013

Только что попробовал ваш фрагмент на моей машине, и он отлично работает (я изменил путь).

        string filepath = @"c:\temp";
   DirectoryInfo dirinfo = new DirectoryInfo(filepath);
   FileInfo[] images = dirinfo.GetFiles("*.*");
   var list = new List<string>();
   foreach (FileInfo image in images) 
   {  
        list.Add(image.Name);      

   }
   lstImages.DataSource = list;

Поэтому я думаю, что это связано с тем, как вы передаете каталог своему конструктору. Рекомендую использовать @"blahblah" для обозначения строковых литералов, как я сделал выше.

person Tom Florkiewicz    schedule 30.10.2013
comment
Спасибо, Том.. но это была моя первоначальная попытка, потом кто-то упомянул, что нужно попробовать переменную для пути. Я дам ему еще один шанс и вернусь к вам - person Mark Lockhart; 30.10.2013
comment
Ему не хватает косой черты!!! в картинкеBox1.ImageLocation. Он пишет имя файла сразу после имени каталога без косой черты между ними!!! Комменты здесь никто не читает что ли? - person varocarbas; 30.10.2013
comment
Неа. Просто сделал то, что вы сказали, и это дало тот же результат, что и всегда: / - person Mark Lockhart; 30.10.2013
comment
@MarkLockhart, ты шутишь, не так ли? - person varocarbas; 30.10.2013
comment
У меня на самом деле не так много варокарбаса. Я изменил эту часть, чтобы работать. но я не могу сначала перечислить предметы - person Mark Lockhart; 30.10.2013
comment
@MarkLockhart Хорошо, хорошо ... Я подумал, что мой английский внезапно стал понятным. Я не знаю, в чем может быть проблема, но эта проблема с путями должна быть исправлена, несмотря ни на что. - person varocarbas; 30.10.2013
comment
Ах, вам нужно обновить источник данных в списке. Итак, попробуйте следующее: string filepath = @c:\temp; Информация о каталоге dirinfo = новая информация о каталоге (путь к файлу); FileInfo[] images = dirinfo.GetFiles(.); var list = новый список‹строка›(); foreach (изображение FileInfo в изображениях) { list.Add (image.Name); } lstImages.DataSource = список; - person Tom Florkiewicz; 30.10.2013

Вы должны сделать переменную пути членом класса. Таким образом, вы можете быть уверены, что оба метода используют один и тот же путь. Но это не причина вашей проблемы. Это недостающая косая черта, когда вы составляете местоположение изображения (как уже указывал @varocarbas в комментарии).

Чтобы избежать таких проблем, вы должны использовать статический Path класс. Заполнение списка также можно сделать более элегантным с помощью LINQ:

string filepath = @"F:\Apps Development\Coursework\3_Coursework\3_Coursework\bin\Debug\Pics";

private void Form1_load(object sender, EventArgs e)
{
    lstImages.Items.AddRange(Directory.GetFiles(filepath, "*.jpg")
                                      .Select(f => Path.GetFileName(f)).ToArray());
}

private void lstImages_SelectedIndexChanged(object sender, EventArgs e)
{
    pictureBox1.ImageLocation = Path.Combine(filepath, lstImages.SelectedItem.ToString());
}
person pescolino    schedule 30.10.2013