无法删除某些其他进程使用的文件

SST*_*SST 2 wpf file-io ioexception c#-4.0

我正在使用以下代码在我的wpf应用中显示一些图像:

 <Image Source="{Binding Path=TemplateImagePath, Mode=TwoWay}"  Grid.Row="3" Grid.Column="2"  Width="400" Height="200"/>
Run Code Online (Sandbox Code Playgroud)

并通过浏览某个目录在代码隐藏的构造函数中设置它的绑定属性,下面是代码:

DirectoryInfo Dir = new DirectoryInfo(@"D:/Template");
            if (Dir.Exists)
            {
                if (Dir.GetFiles().Count() > 0)
                {
                    foreach (FileInfo item in Dir.GetFiles())
                    {
                        TemplateImagePath = item.FullName;
                    }
                }
            }
Run Code Online (Sandbox Code Playgroud)

但是如果用户上传了一些其他图像,那么我需要删除这个旧图像,这是我按照以下方式进行并将图像绑定设置为null:

DirectoryInfo Dir = new DirectoryInfo(@"D:/Template");
                if (Dir.Exists)
                {
                    if (Dir.GetFiles().Count() > 0)
                    {
                        foreach (FileInfo item in Dir.GetFiles())
                        {
                            TemplateImagePath= null;
                            File.Delete(item.FullName);
                        }
                    }
                }
Run Code Online (Sandbox Code Playgroud)

但我得到的异常是无法删除某些其他进程使用的文件.我该如何删除它?

Cle*_*ens 7

为了能够在ImageControl中显示图像时删除图像,您必须创建一个设置了BitmapCacheOption.OnLoad的新BitmapImageBitmapFrame对象.然后立即从文件加载位图,之后文件不会被锁定.

将您的属性更改string TemplateImagePathImageSource TemplateImage并绑定如下:

<Image Source="{Binding TemplateImage}"/>
Run Code Online (Sandbox Code Playgroud)

TemplateImage像这样设置属性:

BitmapImage image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = new Uri(item.FullName);
image.EndInit();
TemplateImage = image;
Run Code Online (Sandbox Code Playgroud)

或这个:

TemplateImage = BitmapFrame.Create(
    new Uri(item.FullName),
    BitmapCreateOptions.None,
    BitmapCacheOption.OnLoad);
Run Code Online (Sandbox Code Playgroud)

如果要保持绑定到TemplateImagePath属性,可以使用绑定转换器将字符串转换为ImageSource,如上所示.

  • 另外我需要添加'System.GC.Collect(); System.GC.WaitForPendingFinalizers();" 在删除该行之前的文件之前:File.Delete(item.FullName) (2认同)