删除其他进程正在使用的文件

bra*_*mco 25 c# wpf file process delete-file

我正在尝试以编程方式删除文件,但该文件显然正在被另一个进程使用(这恰好是我的程序).基本上,程序通过使用FromUri来创建一个Bitmap来加载文件夹中的图像,然后将其加载到Image数组中,然后该数组又成为stackpanel的子项.不是很有效,但它的工作原理.

我已经尝试清除stackpanel的子节点,并使数组中的图像为null,但我仍然得到IOException告诉我该文件正由另一个进程使用.

有没有其他方法从我的应用程序的进程中删除该文件?

kpl*_*rm7 97

它可能是垃圾收集问题.

System.GC.Collect(); 
System.GC.WaitForPendingFinalizers(); 
File.Delete(picturePath);
Run Code Online (Sandbox Code Playgroud)

  • 这实际上解决了我的类似问题谢谢! (4认同)
  • 恼人地(!?)这实际上有效.尝试了其他一切,包括_retry pattern_,但这两行都是那样做的. (2认同)
  • 如果这个答案对您有用,可能是因为您没有关闭“FileStream”。垃圾收集器将调用终结器“~FileStream()”,后者又将调用其自己的“Dispose()”方法,该方法又释放文件句柄(请参阅[源代码](https://source.dot .net/#System.Private.CoreLib/FileStream.cs,844)。) (2认同)

Cle*_*ens 21

要在加载后释放图像文件,您必须通过设置BitmapCacheOption.OnLoad标志来创建图像.一种方法是这样做:

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

虽然设置BitmapCacheOption.OnLoad适用于从本地文件Uri加载的BitmapImage,但这一点无法记录.因此,可能更好或更安全的方法是从FileStream加载图像,方法是设置StreamSource属性而不是UriSource:

string filename = ...
BitmapImage image = new BitmapImage();

using (var stream = File.OpenRead(filename))
{
    image.BeginInit();
    image.CacheOption = BitmapCacheOption.OnLoad;
    image.StreamSource = stream;
    image.EndInit();
}
Run Code Online (Sandbox Code Playgroud)


小智 7

另一种方法是删除文件.使用FileStream类加载文件并通过stream.Dispose();释放文件.它永远不会给你异常"进程无法访问文件',因为它正在被另一个进程使用."

using (FileStream stream = new FileStream("test.jpg", FileMode.Open, FileAccess.Read))
{
    pictureBox1.Image = Image.FromStream(stream);
     stream.Dispose();
}

 // delete your file.

 File.Delete(delpath);
Run Code Online (Sandbox Code Playgroud)