如何修复该进程无法访问该文件,因为它正被另一个进程使用
How to fix The process cannot access the file because it is being used by another process
我写了一个小代码来在不同的屏幕上制作幻灯片程序。一切都很好 运行 删除和复制部分也很好,除非我在第一张图片显示后立即执行。如果我稍后再做,调试器就会介入。
private void timer1_Tick(object sender, EventArgs e)
{
string[] images = Directory.GetFiles(@"D:\reflexscherm\root\Logo-teams2", "*.*");
counter++;
var maxcount = images.Count();
textBox1.Text = maxcount.ToString();
if (counter > maxcount - 1)
{
counter = 0;
maxcount = images.Count();
}
//pb1.Image.Dispose();
pb1.Image = Image.FromFile(images[counter]);
//Image oldImage = pb1.Image;
//pb1.Image.Dispose();
//oldImage.Dispose();
//pb1.Image = Image.FromFile(images[counter]);
}
private void button2_Click(object sender, EventArgs e)
{
timer1.Stop();
Image oldImage = pb1.Image;
pb1.Image = Image.FromFile(@"D:\reflexscherm\root\sponsor1\x. Groot-logo-REFLEX.jpg");
pb1.Image.Dispose();
oldImage.Dispose();
string[] files = System.IO.Directory.GetFiles(sourcepath);
string[] delfiles = Directory.GetFiles(targetpath);
this.Hide();
foreach (string d in delfiles)
{
Image oldI = pb1.Image;
pb1.Image = Image.FromFile(@"D:\reflexscherm\root\sponsor1\x. Groot-logo-REFLEX.jpg");
//pb1.Image.Dispose();
oldI.Dispose();
File.Delete(d);
}
foreach (string s in files)
{
string fname = s.Substring(sourcepath.Length + 1);
File.Copy(Path.Combine(sourcepath, fname), Path.Combine(targetpath, fname), true);
this.Show();
timer1.Start();
}
我正在寻找一些帮助来调整代码,所以当我更改 sourcefolder 中的文件时,程序会将文件从 sourcefolder 复制到 targetfolder。我知道如何使用 filewatcher。我正在使用按钮来测试代码。
我之前遇到过同样的问题,我做了以下操作:
this.photo.Dispose();
this.photo.Refresh();
this.photo.Image.Dispose();
this.photo.Image = null;
this.photo.ImageLocation = null;
值得。
如果您不希望它被锁定,您应该使用只读文件访问:
using( FileStream stream = new FileStream( path, FileMode.Open, FileAccess.Read ) )
{
image = Image.FromStream( stream );
}
希望对您有所帮助...
方法一:保留一个副本,分配一个Control的属性
当一个Bitmap对象在多个地方处理时使用此方法,因此我们需要将其保存以供进一步elaborations/assignments并在之后保存到光盘。
立即分配、存储和处理源位图,删除图像文件:
Bitmap bitmap = null;
//---------------------------------------------
string imagePath = @"[Path of the Image]";
bitmap?.Dispose();
pictureBox1.Image?.Dispose();
using (Bitmap tempImage = new Bitmap(imagePath, true))
{
bitmap = new Bitmap(tempImage);
pictureBox1.Image = bitmap;
}
File.Delete(imagePath);
方法二:分配Bitmap并立即销毁
当您需要将位图分配给控件然后 move/delete 图像文件时,可以使用此方法。图像会立即处理掉,因此只能通过控件的 属性 使用:如果我们要求取回它,有时我们得到的并不完全是我们提供的。
string imagePath = @"[Path of the Image]";
using (Image image = Image.FromFile(imagePath, true))
{
pictureBox1.Image?.Dispose();
pictureBox1.Image = new Bitmap(image);
}
File.Delete(imagePath);
请注意,分配给控件的旧图像(如果有)会在分配新图像之前被处理掉。
另请注意,我总是指定保留内部 ICM 信息(如果有的话),将 true
指定为 new Bitmap(imagePath, true)
和 Image.FromFile(imagePath, true)
的第二个参数。
如果我们不这样做,某些图像将看起来 不像原始图像。
我写了一个小代码来在不同的屏幕上制作幻灯片程序。一切都很好 运行 删除和复制部分也很好,除非我在第一张图片显示后立即执行。如果我稍后再做,调试器就会介入。
private void timer1_Tick(object sender, EventArgs e)
{
string[] images = Directory.GetFiles(@"D:\reflexscherm\root\Logo-teams2", "*.*");
counter++;
var maxcount = images.Count();
textBox1.Text = maxcount.ToString();
if (counter > maxcount - 1)
{
counter = 0;
maxcount = images.Count();
}
//pb1.Image.Dispose();
pb1.Image = Image.FromFile(images[counter]);
//Image oldImage = pb1.Image;
//pb1.Image.Dispose();
//oldImage.Dispose();
//pb1.Image = Image.FromFile(images[counter]);
}
private void button2_Click(object sender, EventArgs e)
{
timer1.Stop();
Image oldImage = pb1.Image;
pb1.Image = Image.FromFile(@"D:\reflexscherm\root\sponsor1\x. Groot-logo-REFLEX.jpg");
pb1.Image.Dispose();
oldImage.Dispose();
string[] files = System.IO.Directory.GetFiles(sourcepath);
string[] delfiles = Directory.GetFiles(targetpath);
this.Hide();
foreach (string d in delfiles)
{
Image oldI = pb1.Image;
pb1.Image = Image.FromFile(@"D:\reflexscherm\root\sponsor1\x. Groot-logo-REFLEX.jpg");
//pb1.Image.Dispose();
oldI.Dispose();
File.Delete(d);
}
foreach (string s in files)
{
string fname = s.Substring(sourcepath.Length + 1);
File.Copy(Path.Combine(sourcepath, fname), Path.Combine(targetpath, fname), true);
this.Show();
timer1.Start();
}
我正在寻找一些帮助来调整代码,所以当我更改 sourcefolder 中的文件时,程序会将文件从 sourcefolder 复制到 targetfolder。我知道如何使用 filewatcher。我正在使用按钮来测试代码。
我之前遇到过同样的问题,我做了以下操作:
this.photo.Dispose();
this.photo.Refresh();
this.photo.Image.Dispose();
this.photo.Image = null;
this.photo.ImageLocation = null;
值得。
如果您不希望它被锁定,您应该使用只读文件访问:
using( FileStream stream = new FileStream( path, FileMode.Open, FileAccess.Read ) )
{
image = Image.FromStream( stream );
}
希望对您有所帮助...
方法一:保留一个副本,分配一个Control的属性
当一个Bitmap对象在多个地方处理时使用此方法,因此我们需要将其保存以供进一步elaborations/assignments并在之后保存到光盘。
立即分配、存储和处理源位图,删除图像文件:
Bitmap bitmap = null;
//---------------------------------------------
string imagePath = @"[Path of the Image]";
bitmap?.Dispose();
pictureBox1.Image?.Dispose();
using (Bitmap tempImage = new Bitmap(imagePath, true))
{
bitmap = new Bitmap(tempImage);
pictureBox1.Image = bitmap;
}
File.Delete(imagePath);
方法二:分配Bitmap并立即销毁
当您需要将位图分配给控件然后 move/delete 图像文件时,可以使用此方法。图像会立即处理掉,因此只能通过控件的 属性 使用:如果我们要求取回它,有时我们得到的并不完全是我们提供的。
string imagePath = @"[Path of the Image]";
using (Image image = Image.FromFile(imagePath, true))
{
pictureBox1.Image?.Dispose();
pictureBox1.Image = new Bitmap(image);
}
File.Delete(imagePath);
请注意,分配给控件的旧图像(如果有)会在分配新图像之前被处理掉。
另请注意,我总是指定保留内部 ICM 信息(如果有的话),将 true
指定为 new Bitmap(imagePath, true)
和 Image.FromFile(imagePath, true)
的第二个参数。
如果我们不这样做,某些图像将看起来 不像原始图像。