所以我正在编写一个快速应用程序来根据纵横比将我的壁纸整齐地分类到文件夹中。一切都很顺利,直到我尝试实际移动文件(使用 FileInfo.MoveTo())。应用程序抛出异常:
System.IO.IOException 该进程无法访问该文件,因为它正被另一个进程使用。
唯一的问题是,我的计算机上没有运行其他进程打开该特定文件。我想也许是因为我使用文件的方式,也许是不同线程上的一些内部系统子例程,或者当我尝试移动文件时文件打开了。果然,在上面几行,我设置了一个属性,该属性调用一个打开文件进行读取的事件。我假设至少其中一些是异步发生的。反正有没有让它同步运行?我必须更改该属性或重写大部分代码。
以下是一些相关的代码,请原谅蹩脚的 Visual C# 默认名称,这还不是真正的发布质量软件:
private void button1_Click(object sender, EventArgs e)
{
for (uint i = 0; i < filebox.Items.Count; i++)
{
if (!filebox.GetItemChecked((int)i)) continue;
//This calls the selectedIndexChanged event to change the 'selectedImg' variable
filebox.SelectedIndex = (int)i;
if (selectedImg == null) continue;
Size imgAspect = getImgAspect(selectedImg);
//This is gonna be hella hardcoded for now
//In the future this should be changed to be generic
//and use some kind of setting schema to determine
//the sort/filter results
FileInfo file = ((FileInfo)filebox.SelectedItem);
if (imgAspect.Width == 8 && imgAspect.Height == 5)
{
finalOut = outPath + "\\8x5\\" + file.Name;
}
else if (imgAspect.Width == 5 && imgAspect.Height == 4)
{
finalOut = outPath + "\\5x4\\" + file.Name;
}
else
{
finalOut = outPath + "\\Other\\" + file.Name;
}
//Me trying to tell C# to close the file
selectedImg.Dispose();
previewer.Image = null;
//This is where the exception is thrown
file.MoveTo(finalOut);
}
}
//The suspected event handler
private void filebox_SelectedIndexChanged(object sender, EventArgs e)
{
FileInfo selected;
if (filebox.SelectedIndex >= filebox.Items.Count || filebox.SelectedIndex < 0) return;
selected = (FileInfo)filebox.Items[filebox.SelectedIndex];
try
{
//The suspected line of code
selectedImg = new Bitmap((Stream)selected.OpenRead());
}
catch (Exception) { selectedImg = null; }
if (selectedImg != null)
previewer.Image = ResizeImage(selectedImg, previewer.Size);
else
previewer.Image = null;
}
我有一个长期的解决方案(无论如何这可能更有效),但它仍然存在更多问题:/
任何帮助将不胜感激。