为什么这段代码会锁定我的文件?

我已经缩小到这个方法,但我不明白为什么它锁定文件。 我相信你可以用类似的东西

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(); } } } 

来自MSDN :“文件保持锁定状态,直到图像被丢弃。” – 所以是的,这应该通过以下方式解决:

 using (Image imgInFile ...) { ... } 

(作为旁注,我会将try catch收紧到.Save()和/或SystemParametersInfo()调用)

一旦您离开使用块,将处理在其中初始化的所有对象。 在您的情况下,将丢弃将删除文件锁定的对象。

您必须手动处理(通过using语句或通过调用对象上的.Dispose())对COM或Windows API函数的任何非托管调用(即,当您使用互操作时)。

以下是我有的请告诉我,如果你看到我可以发现的任何东西。 但它的工作就像一个冠军所以我很高兴。

  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"); } }