このコードがファイルをロックするのはなぜですか?
質問
この方法に絞りましたが、なぜファイルをロックするのかわかりません。次のようなものを使用できると思います
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キャッチを.Save()および/またはSystemParametersInfo()呼び出しのみに強化します)
他のヒント
using ブロックを渡すと、その中で初期化されたすべてのオブジェクトは破棄されます。あなたの場合、オブジェクトは破棄され、ファイルのロックが解除されます。
( using ステートメントを使用するか、オブジェクトで .Dispose()を呼び出すことにより)COMまたはWindows API関数のアンマネージコールを手動で破棄する必要がありますinteropを使用する場合)。
私が持っているものはここにあります。しかし、チャンピオンのように機能するので、私はかなり幸せです。
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");
}
}
所属していません StackOverflow