我正在使用之前编写的Winforms程序。我遇到过一些与它有关的问题,我试图优化它处理某些事情的方式,但我遇到了一些处理问题。
以下是目前正在实施的内容。
首先,首先浏览图片文件夹中的文件,然后将其复制到预览文件夹中。
foreach (string s in files)
{
fileName = System.IO.Path.GetFileName(s);
destFile = System.IO.Path.Combine(path, fileName);
File.Copy(s, destFile, true);
}
下一步,它会通过ShowDialog:
打开一个表单frmPreview frm = new frmPreview(FileNameArray, lblParcel.Text);
frm.ShowDialog();
下一步,它转到预览表单并转到此代码:
try {
FlowLayoutPanel imagePanel = new FlowLayoutPanel();
if (System.IO.Directory.Exists(path))
{
folder = new DirectoryInfo(path);
foreach (FileInfo files in folder.GetFiles())
{
System.Diagnostics.Debug.Print(files.Extension);
if ((string.Equals(files.Extension, ".jpg", StringComparison.OrdinalIgnoreCase)) || (string.Equals(files.Extension, ".gif", StringComparison.OrdinalIgnoreCase)) || (string.Equals(files.Extension, ".png", StringComparison.OrdinalIgnoreCase)))
{
PictureBox image = new PictureBox();
image.Image = Image.FromFile(files.FullName);
image.SizeMode = PictureBoxSizeMode.Zoom;
image.Size = this.Size;
imagePanel.Controls.Add(image);
}
}
}
this.Controls.Add(imagePanel);
System.Threading.Thread.Sleep(0);
return;
}
catch
{
}
上面的代码基本上拍摄了所有照片,每个照片都创建了一个PictureBox,并将PictureBox添加到FlowLayoutPanel以显示在预览窗口中。问题是它没有正确处理并且在第三次尝试访问此预览窗口后被捕获(关闭窗口并再次打开它可以正常工作但是会创建第二个进程)。
最后,它在表单关闭时实现以下功能。
private void frmPreview_FormClosed(object sender, FormClosedEventArgs e)
{
this.Dispose();
this.Close();
}
当程序通过顶部发布的foreach
语句时,第3次调用预览窗口时会发生错误。
它捕获的整行是:
File.Copy(s, destFile, true);
该进程无法访问文件' C:\ Users \ username \ Pictures \ Preview \ image.jpg'因为它正被另一个进程使用。
我99.9%肯定是因为PictureBox
和FlowLayoutPanel
,但我无法弄清楚如何解决这个问题。我想尽可能少地改变,因为这不是我的程序,很快就会被重写。我主要只需要暂时解决问题,直到我们完成整个程序将被废弃的大图。
我发现了一些似乎是类似问题的帖子,但没有一个修改程序发生任何变化。以下是我查看的所有帖子,并尝试实施失败:
file-copy-the-process-cannot-access-the-file
答案 0 :(得分:1)
在实施@RezaAghaei建议后修复了问题。将预览表单更改为:
foreach (FileInfo files in folder.GetFiles())
{
System.Diagnostics.Debug.Print(files.Extension);
if ((string.Equals(files.Extension, ".jpg", StringComparison.OrdinalIgnoreCase)) || (string.Equals(files.Extension, ".gif", StringComparison.OrdinalIgnoreCase)) || (string.Equals(files.Extension, ".png", StringComparison.OrdinalIgnoreCase)))
{
using (var stream = new FileStream(files.FullName, FileMode.Open))
{
PictureBox image = new PictureBox();
image.Image = Image.FromStream(stream);
image.SizeMode = PictureBoxSizeMode.Zoom;
image.Size = this.Size;
imagePanel.Controls.Add(image);
}
}
}
我还通过实现使用块来提高ShowDialog
调用的效率:
using (frmPreviewPhotos frm = new frmPreviewPhotos(NEWphotoFileNameArray, lblParcel.Text))
{
frm.ShowDialog();
}