37

我正在尝试以编程方式删除一个文件,但该文件显然正在被另一个进程(恰好是我的程序)使用。基本上,程序通过使用 FromUri 从文件夹加载图像以创建位图,然后将其加载到图像数组中,该数组又成为堆栈面板的子项。效率不是很高,但它确实有效。

我已经尝试清除堆栈面板的子项,并使数组中的图像为空,但我仍然收到 IOException 告诉我该文件正在被另一个进程使用。

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

4

6 回答 6

133

可能是垃圾收集问题。

System.GC.Collect(); 
System.GC.WaitForPendingFinalizers(); 
File.Delete(picturePath);
于 2014-01-15T12:16:48.840 回答
28

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

string filename = ...
BitmapImage image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = new Uri(filename);
image.EndInit();

尽管设置BitmapCacheOption.OnLoad适用于从本地文件 Uri 加载的 BitmapImage,但这是 afaik 无处记录。因此,一种可能更好或更安全的方法是通过设置StreamSource属性而不是从 FileStream 加载图像UriSource

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

using (var stream = File.OpenRead(filename))
{
    image.BeginInit();
    image.CacheOption = BitmapCacheOption.OnLoad;
    image.StreamSource = stream;
    image.EndInit();
}
于 2012-11-07T07:40:44.750 回答
11

另一种方法是删除文件。使用 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);
于 2013-06-15T08:02:35.767 回答
3
var uploadedFile = Request.Files[0]; //Get file
var fileName = Path.GetFileName(uploadedFile.FileName);  //get file name
string fileSavePath = Server.MapPath(fileName); //get path
uploadedFile.SaveAs(fileSavePath); //saving file
FileInfo info = new FileInfo(fileSavePath);//get info file
//the problem ocurred because this, 
FileStream s = new FileStream(fileSavePath, FileMode.Open); //openning stream, them file in use by a process
System.IO.File.Delete(fileSavePath); //Generete a error
//problem solved here...
s.Close();
s.Dispose();
System.IO.File.Delete(fileSavePath); //File deletad sucessfully!
于 2016-04-06T15:39:32.050 回答
-1

我有类似的问题。唯一的区别是我使用的是绑定(MVVM 模式)。没有什么工作,然后我删除了所有东西,并在调用之前尝试了绑定Mode=OneWayGC.Collect()File.Delete(path)终于起作用了。

于 2017-11-29T18:14:48.887 回答
-1

我遇到过同样的问题。我遇到的问题是 openFileDialog 和 saveFileDialog 具有以下设置:

MyDialog.AutoUpgradeEnabled = false;

我注释掉了那行,它得到了解决。

于 2018-01-26T18:27:34.733 回答