почему этот код блокирует мои файлы?
Вопрос
Я остановился на этом методе, но не понимаю, почему он блокирует файл.Я считаю, что вы могли бы использовать что-то вроде
using( something)
{
//do stuff here
}
Но я не уверен, что это А) решило бы проблему или Б) было бы правильным способом, если бы это было так.
Любые идеи?
[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 ...) { ... }
(В качестве примечания: я бы сузил улов попытки только до вызовов .Save() и/или SystemParametersInfo())
Другие советы
Как только вы выйдете из с использованием блок, все объекты, инициализированные в нем, удаляются.В вашем случае объекты будут удалены, что снимет блокировку файла.
Вы должны удалить вручную (либо через с использованием заявление или позвонив .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");
}
}