почему этот код блокирует мои файлы? - PullRequest
5 голосов
/ 30 апреля 2009

Я сузился до этого метода, но я не понимаю, почему он блокирует файл. Я считаю, что вы могли бы использовать что-то вроде

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

Ответы [ 3 ]

15 голосов
/ 30 апреля 2009

С MSDN : «Файл остается заблокированным, пока изображение не будет удалено». - так что да, это должно быть исправлено с помощью:

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

(В качестве примечания я бы ограничил попытку try только вызовами .Save () и / или SystemParametersInfo ())

1 голос
/ 30 апреля 2009

Как только вы выходите из с помощью блока , все объекты, инициализированные в нем, удаляются. В вашем случае объекты будут удалены, что снимет блокировку файла.

Вы должны вручную удалить (либо с помощью оператора , используя оператор , либо путем вызова .Dispose () для объекта) любые неуправляемые вызовы функций COM или Windows API (т.е. использовать взаимодействие).

0 голосов
/ 30 апреля 2009

Вот то, что у меня есть, пожалуйста, дайте мне знать, если вы увидите что-нибудь, что я мог бы сделать красиво Но он работает как чемпион, поэтому я очень счастлив.

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