我已经缩小到这个方法,但我不明白为什么它锁定文件。我相信你可以使用像
这样的东西using( something)
{
//do stuff here
}
但我不确定A)会解决这个问题,或者B)是否是正确的方法。
任何想法?
[DllImport("user32.dll", CharSet = CharSet.Auto)]private static extern Int32 SystemParametersInfo(UInt32 action, UInt32 uParam, String vParam, UInt32 winIni);
private static readonly UInt32 SPI_SETDESKWALLPAPER = 0x14;
private static readonly UInt32 SPIF_UPDATEINIFILE = 0x01;
private static readonly UInt32 SPIF_SENDWININICHANGE = 0x02;
private void SetWallpaper(string path)
{
try
{
Image imgInFile = Image.FromFile(path);
imgInFile.Save(SaveFile, ImageFormat.Bmp);
SystemParametersInfo(SPI_SETDESKWALLPAPER, 3, SaveFile, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
}
catch
{
MessageBox.Show("error in setting the wallpaper");
}
}
#
更新了代码
private void SetWallpaper(string path)
{
if (File.Exists(path))
{
Image imgInFile = Image.FromFile(path);
try
{
imgInFile.Save(SaveFile, ImageFormat.Bmp);
SystemParametersInfo(SPI_SETDESKWALLPAPER, 3, SaveFile, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
}
catch
{
MessageBox.Show("error in setting the wallpaper");
}
finally
{
imgInFile.Dispose();
}
}
}
答案 0 :(得分:15)
从MSDN:“文件保持锁定状态,直到图像被处理完毕。” - 所以是的,这应该通过以下方式解决:
using (Image imgInFile ...) { ... }
(作为旁注,我会将try catch收紧到.Save()和/或SystemParametersInfo()调用)
答案 1 :(得分:1)
一旦您离开使用块,其中初始化的所有对象都将被释放。在您的情况下,将丢弃对象,这将删除文件上的锁。
您必须手动处理(通过使用语句或通过调用对象上的 .Dispose())对COM或Windows API函数的任何非托管调用(即当你使用互操作时。)
答案 2 :(得分:0)
如果您看到任何我能说的话,请告诉我。但它的工作就像一个冠军所以我很高兴。
private void SetWallpaper(string path)
{
if (File.Exists(path))
{
Image imgInFile = Image.FromFile(path);
try
{
imgInFile.Save(SaveFile, ImageFormat.Bmp);
SystemParametersInfo(SPI_SETDESKWALLPAPER, 3, SaveFile, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
}
catch
{
MessageBox.Show("error in setting the wallpaper");
}
finally
{
imgInFile.Dispose();
}
}
Else
{
messagebox.show("Error with path: "+path+" Not found or in use");
}
}