本文介绍了等待文件被进程释放的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何等待文件空闲,以便 ss.Save()
可以用新文件覆盖它?如果我同时运行两次(ish),我会收到 generic GDI+
错误.
How do I wait for the file to be free so that ss.Save()
can overwrite it with a new one? If I run this twice close together(ish), I get a generic GDI+
error.
///<summary>
/// Grabs a screen shot of the App and saves it to the C drive in jpg
///</summary>
private static String GetDesktopImage(DevExpress.XtraEditors.XtraForm whichForm)
{
Rectangle bounds = whichForm.Bounds;
// This solves my problem but creates a clutter issue
// var timeStamp = DateTime.Now.ToString("ddd-MMM-dd-yyyy-hh-mm-ss");
// var fileName = "C:\HelpMe" + timeStamp + ".jpg";
var fileName = "C:\HelpMe.jpg";
File.Create(fileName);
using (Bitmap ss = new Bitmap(bounds.Width, bounds.Height))
using (Graphics g = Graphics.FromImage(ss))
{
g.CopyFromScreen(whichForm.Location, Point.Empty, bounds.Size);
ss.Save(fileName, ImageFormat.Jpeg);
}
return fileName;
}
推荐答案
像这样的函数可以做到:
A function like this will do it:
public static bool IsFileReady(string filename)
{
// If the file can be opened for exclusive access it means that the file
// is no longer locked by another process.
try
{
using (FileStream inputStream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.None))
return inputStream.Length > 0;
}
catch (Exception)
{
return false;
}
}
把它放在一个 while
循环中,你有一些东西会阻塞直到文件可访问:
Stick it in a while
loop and you have something which will block until the file is accessible:
public static void WaitForFile(string filename)
{
//This will lock the execution until the file is ready
//TODO: Add some logic to make it async and cancelable
while (!IsFileReady(filename)) { }
}
这篇关于等待文件被进程释放的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!