C# 如何关闭由另一个线程打开的文件?
我有一个后台线程,它使用C# 如何关闭由另一个线程打开的文件?,c#,C#,我有一个后台线程,它使用image.FromFile加载图像文件,我想从另一个线程关闭打开的图像文件 是否有可能关闭由c#中的后台线程打开的文件 编辑: 我一开始在同一个线程上使用了这段代码,但我不知道为什么我不能释放或删除文件,甚至不能删除我使用img.Save(…)保存的新文件。所以我试图在另一个线程上强制关闭。这就是我问这个问题的原因 var img = Image.FromFile(filepath); img.Save(filepath + ".jpg", ImageFormat.Jp
image.FromFile
加载图像文件,我想从另一个线程关闭打开的图像文件
是否有可能关闭由c#中的后台线程打开的文件
编辑:
我一开始在同一个线程上使用了这段代码,但我不知道为什么我不能释放或删除文件,甚至不能删除我使用img.Save(…)
保存的新文件。所以我试图在另一个线程上强制关闭。这就是我问这个问题的原因
var img = Image.FromFile(filepath);
img.Save(filepath + ".jpg", ImageFormat.Jpeg);
img.Dispose();
if (File.Exists(filepath+ ".jpg"))
File.Delete(+ ".jpg");
if (File.Exists(filepath))
File.Delete(filepath);
在图像被释放之前,文件不会“关闭”。通过加载包含以下代码段的图像,一步即可立即打开和关闭文件:
System.Drawing.Bitmap image;
using (var fileLoadImage = System.Drawing.Bitmap.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg"))
{
image = new System.Drawing.Bitmap(fileLoadImage);
}
但是,您需要非常小心使用此模式,因为在处理完图像后,仍然必须显式调用image.Dispose()
。不过,至少这会让您绕过文件锁定
祝你好运
编辑-可运行的代码段
将以下内容复制并粘贴到新的控制台应用程序中,以查看其是否正常工作。在开始之前,请确保示例图片中有一个名为“test.jpg”的文件,您将看到这样做可以很好地删除原始文件和新文件:
public class Program
{
public static void Main(string[] args)
{
System.Drawing.Bitmap image;
var originalFile = @"C:\Users\Public\Pictures\Sample Pictures\test.jpg";
var newFile = @"C:\Users\Public\Pictures\Sample Pictures\test2.jpg";
using (var fileLoadImage = System.Drawing.Bitmap.FromFile(originalFile))
{
image = new System.Drawing.Bitmap(fileLoadImage);
}
image.Save(newFile);
System.IO.File.Delete(originalFile);
image.Dispose();
System.IO.File.Delete(newFile);
}
}
在图像被释放之前,文件不会“关闭”。通过加载包含以下代码段的图像,一步即可立即打开和关闭文件:
System.Drawing.Bitmap image;
using (var fileLoadImage = System.Drawing.Bitmap.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg"))
{
image = new System.Drawing.Bitmap(fileLoadImage);
}
但是,您需要非常小心使用此模式,因为在处理完图像后,仍然必须显式调用image.Dispose()
。不过,至少这会让您绕过文件锁定
祝你好运
编辑-可运行的代码段
将以下内容复制并粘贴到新的控制台应用程序中,以查看其是否正常工作。在开始之前,请确保示例图片中有一个名为“test.jpg”的文件,您将看到这样做可以很好地删除原始文件和新文件:
public class Program
{
public static void Main(string[] args)
{
System.Drawing.Bitmap image;
var originalFile = @"C:\Users\Public\Pictures\Sample Pictures\test.jpg";
var newFile = @"C:\Users\Public\Pictures\Sample Pictures\test2.jpg";
using (var fileLoadImage = System.Drawing.Bitmap.FromFile(originalFile))
{
image = new System.Drawing.Bitmap(fileLoadImage);
}
image.Save(newFile);
System.IO.File.Delete(originalFile);
image.Dispose();
System.IO.File.Delete(newFile);
}
}
这听起来是个很糟糕的主意。为什么需要强制关闭文件?你的线程正在使用它!通常不是这样。在这种情况下,您必须处理图像对象,即使您可以这样做,后台线程也可能不喜欢它。这是一个很少有机会问的问题-为什么需要这样做?任何线程都可以调用图像对象的dispose()方法。联锁以确保没有线程在使用对象取决于您。显示相关代码,可能是您做错了什么。这听起来是一个非常糟糕的主意。为什么需要强制关闭文件?你的线程正在使用它!通常不是这样。在这种情况下,您必须处理图像对象,即使您可以这样做,后台线程也可能不喜欢它。这是一个很少有机会问的问题-为什么需要这样做?任何线程都可以调用图像对象的dispose()方法。联锁以确保没有线程使用对象取决于您。显示相关代码,可能是您做错了什么。我已经更新了问题。请检查一下。我还尝试使用
内存流(File.ReadAllBytes(filepath))代码>但是我也不能删除这个文件,尽管我正在调用Close,然后Dispose,在MemoryStream和我从image.FromStream
@donfoneseo获得的图像上。我编写了一个示例程序,一切都完全按照预期进行。我将代码粘贴到编辑后的答案中,供您使用。我建议检查应用程序的其他部分是否正在使用该文件。如果您正在启动后台线程,可能有多个线程正在访问同一个文件?不管怎么说,一切都按预期进行!我已经更新了这个问题。请检查一下。我还尝试使用内存流(File.ReadAllBytes(filepath))代码>但是我也不能删除这个文件,尽管我正在调用Close,然后Dispose,在MemoryStream和我从image.FromStream
@donfoneseo获得的图像上。我编写了一个示例程序,一切都完全按照预期进行。我将代码粘贴到编辑后的答案中,供您使用。我建议检查应用程序的其他部分是否正在使用该文件。如果您正在启动后台线程,可能有多个线程正在访问同一个文件?不管怎么说,一切都按预期进行!