Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用windows窗体c删除文件#_C#_Winforms_Delete File_Imagelist - Fatal编程技术网

C# 如何使用windows窗体c删除文件#

C# 如何使用windows窗体c删除文件#,c#,winforms,delete-file,imagelist,C#,Winforms,Delete File,Imagelist,我已经用imagelist创建了listview和delete函数,该函数将使用在listview上选择的文件名删除/删除文件 但是我得到一个错误,该文件正被另一个进程使用。下面是我正在使用的代码: //// Listview with Imagelist private void listImages() { imageList.View = View.Details; imageList.Columns.Add("Images", 650); ImageList imgs

我已经用
imagelist
创建了
listview
和delete函数,该函数将使用在listview上选择的文件名删除/删除文件

但是我得到一个错误,该文件正被另一个进程使用。下面是我正在使用的代码:

//// Listview with Imagelist
private void listImages()
{
   imageList.View = View.Details;
   imageList.Columns.Add("Images", 650);
   ImageList imgs = new ImageList();
   imgs.ImageSize = new Size(200, 130);

   DirectoryInfo d = new DirectoryInfo(adsFolder);
   FileInfo[] Files = {};

   try
   {
      Files = d.GetFiles("*");

      for (var i = 0; i < Files.Count(); i++)
      {
         imgs.Images.Add(Image.FromFile(Files[i].FullName));
         imageList.Items.Add(Files[i].Name, i);
      }

      imageList.SmallImageList = imgs;
   }

   catch (Exception e)
   {
       MessageBox.Show(e.Message);
   }
}

//// Delete function
private void deleteFile_Click(object sender, EventArgs e)
{
   using (FileStream stream = new FileStream("Selected Image"), FileMode.Open, FileAccess.Read))
   {
      stream.Dispose();
   }

   File.Delete("Selected Image");
}
///Listview和Imagelist
私有void列表图像()
{
imageList.View=View.Details;
imageList.Columns.Add(“图像”,650);
ImageList imgs=新的ImageList();
imgs.ImageSize=新尺寸(200130);
DirectoryInfo d=新的DirectoryInfo(adsFolder);
FileInfo[]Files={};
尝试
{
Files=d.GetFiles(“*”);
对于(var i=0;i

我发现
imagelist
导致错误,因为图像列在imagelist上。当我删除
imagelist
时,它工作正常。但是,我希望在我的
列表视图上保留
图像列表
。如何停止或清除
图像列表
,使其不再使用所选图像,并继续删除所选文件?我尝试使用
imagelist.clear()
,但没有成功

您的问题是这一行:

imgs.Images.Add(Image.FromFile(Files[i].FullName));
具体地说,
Image.FromFile
正在创建一个非托管位图资源,该资源具有文件的打开句柄

您需要
处理为imageList创建的位图

如果您有索引,您可以执行以下操作:

imageList.Images[index].Dispose();
ImageList.Images.RemoveAt(index);
File.Delete(FileName);

您的问题是这一行:

imgs.Images.Add(Image.FromFile(Files[i].FullName));
具体地说,
Image.FromFile
正在创建一个非托管位图资源,该资源具有文件的打开句柄

您需要
处理为imageList创建的位图

如果您有索引,您可以执行以下操作:

imageList.Images[index].Dispose();
ImageList.Images.RemoveAt(index);
File.Delete(FileName);

有两种方法:在将图像添加到ImageList之前克隆图像,或在删除位图之前处置位图。在第二种情况下,位图文件在被引用时将被锁定。在第一种情况下,永远不会。
使用(FileStream stream(…)
这很难理解。1)当您使用
使用
块处理同一个一次性文件时,不需要调用
Dispose
。2) 如果要在删除回调中删除文件,为什么还要费心读取该文件?有两种方法:在将图像添加到ImageList之前克隆图像,或者在删除位图之前处理位图。在第二种情况下,位图文件在被引用时将被锁定。在第一种情况下,永远不会。
使用(FileStream stream(…)
这很难理解。1)当您使用
使用
块处理同一个一次性文件时,不需要调用
Dispose
。2) 如果要在删除回调中删除该文件,为什么还要费心读取该文件?我使用了
imageList.Dispose()但它不起作用。我还尝试使用
ImageList.RemoveAt(index)
但是有一个错误,说ImageList不包含
RemoveAt
@richard如果不想处理ImageList,则需要处理其中的项目。请检查文档,我已经更新了我的答案,我使用了
imageList.Dispose()但它不起作用。我还尝试使用
ImageList.RemoveAt(index)
但是有一个错误,说ImageList不包含
RemoveAt
@richard如果不想处理ImageList,则需要处理其中的项目。请检查文档,我也更新了我的答案