Удалить выбранный файл из списка и папки

Я хочу удалить выбранный файл из списка и папки. На данный момент это только удаление его из списка. Теперь я хочу, чтобы его также удалили из папки. Спасибо

    private void tDeletebtn_Click(object sender, EventArgs e)

    {
        if (listBox1.SelectedIndex != -1)
            listBox1.Items.RemoveAt(listBox1.SelectedIndex);
    }

   private void TeacherForm_Load(object sender, EventArgs e)
    {
        DirectoryInfo dinfo = new DirectoryInfo(@"data\\Teachers\\");
        FileInfo[] Files = dinfo.GetFiles("*.xml");
        foreach (FileInfo file in Files)
        {
            listBox1.Items.Add(file.Name);
        }
    }

person Luke_i    schedule 05.03.2016    source источник
comment
У вас есть путь к файлу в ваших элементах списка? это полный путь?   -  person Ian    schedule 05.03.2016
comment
Возможный дубликат Как удалить файл после проверки его существует   -  person Eugene Podskal    schedule 05.03.2016


Ответы (2)


Если ваш listBox1.Items содержит ваш путь к файлу, вы можете просто передать его, отменив ссылку на filepath, и удалить его с помощью File.Delete следующим образом:

private void tDeletebtn_Click(object sender, EventArgs e)
{
    if (listBox1.SelectedIndex != -1){
        string filepath = listBox1.Items[listBox1.SelectedIndex].ToString();
        if(File.Exists(filepath))
            File.Delete(filepath);            
        listBox1.Items.RemoveAt(listBox1.SelectedIndex);
    }
}

То есть, если вы добавите свои пути к listBox1, используя FullName вместо Name:

    DirectoryInfo dinfo = new DirectoryInfo(@"data\\Teachers\\");
    FileInfo[] Files = dinfo.GetFiles("*.xml");
    foreach (FileInfo file in Files)
    {
        listBox1.Items.Add(file.FullName); //note FullName, not Name
    }

Если вы не хотите не добавлять полное имя в listBox1, вы также можете сохранить имя Folder отдельно, так как оно все равно не будет изменено:

string folderName; //empty initialization
.
.
    DirectoryInfo dinfo = new DirectoryInfo(@"data\\Teachers\\");
    FileInfo[] Files = dinfo.GetFiles("*.xml");
    folderName = dinfo.FullName; //here you initialize your folder name
    //Thanks to FᴀʀʜᴀɴAɴᴀᴍ
    foreach (FileInfo file in Files)
    {
        listBox1.Items.Add(file.Name); //just add your filename here
    }

И тогда вы просто используете его так:

private void tDeletebtn_Click(object sender, EventArgs e)
{
    if (listBox1.SelectedIndex != -1){
        //Put your folder name here..
        string filepath = Path.Combine(folderName, listBox1.Items[listBox1.SelectedIndex].ToString());
        if(File.Exists(filepath))
            File.Delete(filepath);            
        listBox1.Items.RemoveAt(listBox1.SelectedIndex);
    }
}
person Ian    schedule 05.03.2016
comment
как будто он все еще удаляет их только из моего списка - person Luke_i; 05.03.2016
comment
@Luke_i, можешь показать, как выглядит текст в твоем listBox1? ключевое слово здесь полный путь. Если это неправильный путь, то это связано с тем, что пути нет, и вы вообще не можете удалить файл... - person Ian; 05.03.2016
comment
он перечисляет их как «Test.xml», «Test2.xml» друг под другом - person Luke_i; 05.03.2016
comment
Но если он их загружает, то у меня не может быть неправильного пути к файлу... Я думаю - person Luke_i; 05.03.2016
comment
@Luke_i вот оно! там нет пути к папке! Вы видите это? ;) Это потому, что когда вы впервые открываете файл, вы добавляете только file.Name. Если вы добавите его так: listBox1.Items.Add(file.FullName);, тогда у вас есть полный путь - person Ian; 05.03.2016
comment
Теперь я понял... XD Глупый я... foreach (файл FileInfo в файлах) { listBox1.Items.Add(file.Name); } ... так как мне правильно его добавить? Спасибо - person Luke_i; 05.03.2016
comment
@Luke_i использует FullName вместо Name - person Ian; 05.03.2016
comment
Спасибо, это сработало! Но я бы хотел, чтобы он показывал мне имя файла вместо пути, если это возможно. Спасибо - person Luke_i; 05.03.2016
comment
@ Ян, что нового в редактировании? Я не вижу смысла в переменной folderName. - person Fᴀʀʜᴀɴ Aɴᴀᴍ; 05.03.2016
comment
@ FᴀʀʜᴀɴAɴᴀᴍ Это только для демонстрации. Это означает, что ему нужно сохранить имя папки только один раз. И затем он использует его как часть пути к файлу Path.Combine, так что listBox1 на самом деле будет показывать только fileName - person Ian; 05.03.2016
comment
@ Ян, разве тогда это не должно быть `data\\Teachers\\`? - person Fᴀʀʜᴀɴ Aɴᴀᴍ; 05.03.2016
comment
@Ian не может быть проще? Вместо того, чтобы показывать полный путь, я показываю имя? Я не могу использовать определенное место назначения для сохранения файлов в - person Luke_i; 05.03.2016
comment
@FᴀʀʜᴀɴAɴᴀᴍ о, ты прав! Я этого не видел! это должны быть данные\\Учителя - person Ian; 05.03.2016
comment
@Luke_i Другой способ - создать отдельный класс, который может содержать как имя файла, так и полное имя файла. Затем вы можете переопределить его функцию ToString(), чтобы она возвращала только имя. Но когда вы обращаетесь к нему, вы все равно можете получить путь, обратившись к свойству. - person Fᴀʀʜᴀɴ Aɴᴀᴍ; 05.03.2016
comment
@Luke_i, да, это можно упростить, потому что у вас уже есть информация о каталоге, которая ссылается на data\\Teachers\\. Заслуга в том, что Фархан Анам это заметил. Я обновил свой ответ, чтобы сделать его более простым и гибким, ссылаясь на информацию о вашем каталоге при инициализации. - person Ian; 05.03.2016
comment
@Ian Хорошо, это может быть с полным путем, но если файл не найден, разве он не должен вызывать какое-то другое исключение, а не «NullReferenceException»? - person Fᴀʀʜᴀɴ Aɴᴀᴍ; 05.03.2016
comment
@Ian На самом деле, это даже не должно вызывать исключение! - person Fᴀʀʜᴀɴ Aɴᴀᴍ; 05.03.2016
comment
@ FᴀʀʜᴀɴAɴᴀᴍ хм ... если он выдает исключение, значит, его там нет ... это означает, что предмета нет. - person Ian; 05.03.2016
comment
@Ian О, извините, ОП не упомянул об исключении при использовании вашего ответа. Извините еще раз;) Это был мой ответ, который вызвал исключение, вероятно, из-за использования SelectedItem.. - person Fᴀʀʜᴀɴ Aɴᴀᴍ; 05.03.2016
comment
@FᴀʀʜᴀɴAɴᴀᴍ а, понял. В вашем случае вы сначала удаляете элемент из listBox, а затем в следующей строке вы делаете SelectedItem.ToString(), которые были удалены предыдущей строкой. Вот почему вы получили Exception - NullException. :) исправь это! - person Ian; 05.03.2016
comment
@Luke_i вы заметили: Path.Combine(folderName, там проскользнуло folderName... ;) оно используется для создания fullpath - person Ian; 05.03.2016
comment
@Luke_i ах, да, я не хотел создавать там новые строки кода ... я просто обращаю ваше внимание на то, что там пропущено folderName ... - person Ian; 05.03.2016
comment
@Ian Я не могу использовать имя папки, потому что я никогда не использовал его нигде в действии «Удалить кнопку». Я использовал его в действии «Загрузка формы». Благодарность - person Luke_i; 05.03.2016
comment
@Ian nvm Это сработало .. я просто удалил строку folderName, потому что использовал ее в действии formLoad. Большое спасибо :D - person Luke_i; 05.03.2016

Если у вас есть соответствующие права доступа к файлу, это должно работать достаточно хорошо:

System.IO.File.Delete(listBox1.SelectedItem.ToString());

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

Итак, ваш окончательный код будет таким:

private void tDeletebtn_Click(object sender, EventArgs e)

{
    if (listBox1.SelectedIndex != -1)
    {
        System.IO.File.Delete(listBox1.Items[listBox1.SelectedIndex].ToString());
        listBox1.Items.RemoveAt(listBox1.SelectedIndex);
    }
}

Видеть:

Убедитесь, что вы действительно выбрали что-то в своем ListBox!

person Fᴀʀʜᴀɴ Aɴᴀᴍ    schedule 05.03.2016
comment
Например, это дало мне исключение Null Reference Exception, которое не было обработано - ссылка на объект не установлена ​​​​на экземпляр объекта. - person Luke_i; 05.03.2016
comment
Хорошо, путь к папке принадлежит вам .. ;) проголосовал за. - person Ian; 05.03.2016
comment
Нет, нет, я имею в виду, что важна последовательность, а не использование SelectedItem или SelectedIndex - person Ian; 05.03.2016