C# 删除另一进程正在使用的文件

C# 删除另一进程正在使用的文件,c#,wpf,file,process,delete-file,C#,Wpf,File,Process,Delete File,我试图以编程方式删除一个文件,但该文件显然正被另一个进程(碰巧是我的程序)使用。基本上,程序通过使用FromUri创建位图从文件夹加载图像,然后将位图加载到图像数组中,图像数组又成为stackpanel的子级。效率不是很高,但它很有效 我已尝试清除stackpanel的子进程,并使数组中的图像为空,但仍然收到IOException通知,该文件正被另一个进程使用 using (FileStream stream = new FileStream("test.jpg", FileMode.Open,

我试图以编程方式删除一个文件,但该文件显然正被另一个进程(碰巧是我的程序)使用。基本上,程序通过使用FromUri创建位图从文件夹加载图像,然后将位图加载到图像数组中,图像数组又成为stackpanel的子级。效率不是很高,但它很有效

我已尝试清除stackpanel的子进程,并使数组中的图像为空,但仍然收到IOException通知,该文件正被另一个进程使用

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

 // delete your file.

 File.Delete(delpath);

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

为了在加载后释放图像文件,您必须通过设置
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,但这一点没有文档记录。因此,更好或更安全的方法可能是从文件流加载映像,方法是设置
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();
}

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


这可能是垃圾收集问题

System.GC.Collect(); 
System.GC.WaitForPendingFinalizers(); 
File.Delete(picturePath);

我也有类似的问题。唯一的区别是我使用的是绑定(MVVM模式)。没有什么效果,然后我删除了所有内容,并在调用
File.Delete(path)
之前尝试了绑定
Mode=one-way
GC.Collect()
,最后成功了。

我也遇到了同样的问题。我遇到的问题是openFileDialog和saveFileDialog的设置如下:

MyDialog.AutoUpgradeEnabled=false


我把那行注释掉了,它被解决了。

你在处理图像吗?将它们设置为null意味着它们的句柄在被垃圾收集之前不会被关闭。显示加载它们的代码。如果你有悬垂的根,它们仍然是开放的。谢谢你,这解决了我的问题。但是,我想知道,从文件中创建位图图像是否会对内存产生影响?我想我会把它作为一个单独的问题发布。就是这个问题!整个上午我都在搞图像缩放程序,这就是解决办法。使用
newuri(path)
是个问题,它被
OpenRead
流所取代,并且它是固定的。令人恼火的是(!?)这实际上是有效的。尝试了其他一切,包括重试模式,但这两行是成功的。这对我也有帮助。。谢谢您的解决方案。:)这对我也有帮助。谢谢你!这对我也有帮助!如果这个答案对您有效,可能是因为您没有关闭
文件流
。垃圾收集器将调用终结器
~FileStream()
,终结器将调用自己的
Dispose()
方法,然后释放文件句柄(请参阅)。不过,如果您稍后尝试操作、克隆甚至保存映像,显然这会出现异常。
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!