标题:求助关于C#删除图片的问题
只看楼主
Amethystarry
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2010-9-19
结帖率:100%
已结贴  问题点数:20 回复次数:5 
求助关于C#删除图片的问题
我用一个listbox显示一个文件夹里所有的图片(listbox的属性为可多选)
当选择列表里的图片时就将图片显示出来;
添加一个删除的button;当点击时就删除所选择的图片。
虽然选择一张和多张时都没有问题,
不过还有一点问题:
如果我选择了一张图片(第一张),然后按住ctrl选择另一张图片(第二张),再然后按住ctrl单击第二张图片将第二张图片的选择取消(现在就是剩下刚开始选择的第一张图片了),最后点击删除。
问题来了,报错说“正由另一进程使用,因此该进程无法访问此文件”
求解答
附上代码----------------------------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using
using System.Collections;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        ArrayList y;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
                DirectoryInfo x = new DirectoryInfo(@"F:\新建文件夹 (2)");
                foreach (FileSystemInfo f in x.GetFileSystemInfos())
                {
                    listBox1.Items.Add(f.FullName);
                }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            y = new ArrayList();
            foreach (string x in listBox1.SelectedItems)
            {
                y.Add(x);
            }

            listBox1.ClearSelected();
            pictureBox1.Image.Dispose();
            //pictureBox1.Image = null;
            foreach (string x in y)
            {
                (x);
                listBox1.Items.Remove(x);
            }

        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            Image img = null;
            FileInfo file;
            if (listBox1.SelectedItems.Count == 1)
            {
                file = new FileInfo(listBox1.SelectedItem.ToString());
                img = new Bitmap(listBox1.SelectedItem.ToString(), false);
                pictureBox1.Image = img;
            }
        }
    }
}
顺便把这段程序打包了http://u.
搜索更多相关主题的帖子: 没有问题 文件夹 图片 
2010-12-29 21:15
yangglemu
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:273
专家分:521
注 册:2006-9-15
得分:8 
提点无关的小建议:
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            Image img = null;
            FileInfo file;//此变量有用否?
            if (listBox1.SelectedItems.Count == 1)
            {
                file = new FileInfo(listBox1.SelectedItem.ToString());//这个好象多余,去掉
                img = new Bitmap(listBox1.SelectedItem.ToString(), false);
                pictureBox1.Image = img;
            }
        }

再看这个函数:
private void button2_Click(object sender, EventArgs e)
        {
            y = new ArrayList();
            foreach (string x in listBox1.SelectedItems)
            {
                y.Add(x);
            }

            listBox1.ClearSelected();//估计问题的根源在此,注释掉再试试
            pictureBox1.Image.Dispose();
            //pictureBox1.Image = null;
            foreach (string x in y)
            {
                (x);
                listBox1.Items.Remove(x);
            }

        }

listBox1.ClearSelected()这个执行时,会引发函数void listBox1_SelectedIndexChanged()的执行,前一个函数要删除掉,后一个函数要读取,而且是同一个文件,冲突发生



试着挣个威望!
2010-12-29 22:56
c1_wangyf
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:7
帖 子:665
专家分:2832
注 册:2010-5-24
得分:4 
楼上提到值得你仔细思考!!
2010-12-30 08:44
Amethystarry
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2010-9-19
得分:0 
将 listBox1.ClearSelected();和listBox1.Items.Remove(x);这两个可能引发void listBox1_SelectedIndexChanged()执行的方法都注释掉了,还是不行;
其实当时用listBox1.ClearSelected()是因为如果图片大于一张时后面的listBox1.Items.Remove(x)就会引发void listBox1_SelectedIndexChanged()的执行,
因为void listBox1_SelectedIndexChanged()中显示图片的方法执行的条件是选择数等于1;而用listBox1.Items.Remove(x)的话最后肯定会变成选择只有一个而导致显示图片方法的执行;
用listBox1.ClearSelected()一下子将所有选择全部取消掉就能避免此问题了;
不过还是谢谢2L的提醒~
2010-12-30 11:08
yangglemu
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:273
专家分:521
注 册:2006-9-15
得分:8 
每次选择或者取消选择时,下面的函数都要执行:
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {/******************************
            Image img = null;
            FileInfo file;
            if (listBox1.SelectedItems.Count == 1)
            {
                file = new FileInfo(listBox1.SelectedItem.ToString());//或者把这个没用的file删掉
                img = new Bitmap(listBox1.SelectedItem.ToString(), false);
                pictureBox1.Image = img;
            }*///////////////////注释掉
        }

因为.Net的垃圾回收机制不会马上清理内存,也就是说,虽然出了作用域,但file占用的系统文件资源不会立即释放,FileInfo默认是用读写的方式打开文件,其它文件在它没释放的情况下访问,就出楼主那样的错误

试着挣个威望!
2010-12-31 14:11
Amethystarry
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2010-9-19
得分:0 
谢谢LS恩~
不过如果把这段都注释掉,那图片框也就再也不能显示图片了吧?

刚才已经有朋友帮忙解决了
在 listBox1_SelectedIndexChanged上加个
    if (pictureBox1.Image != null)
        pictureBox1.Image.Dispose();
就行了。。。
 private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (pictureBox1.Image != null)
                pictureBox1.Image.Dispose();
            Image img = null;
            FileInfo file;
            if (listBox1.SelectedItems.Count == 1)
            {
                file = new FileInfo(listBox1.SelectedItem.ToString());
                img = new Bitmap(listBox1.SelectedItem.ToString(), false);
                pictureBox1.Image = img;
            }
        }
2010-12-31 17:50



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-330240-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.060987 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved