سؤال

لقد قمت بتضييق نطاق هذه الطريقة ولكني لا أفهم سبب قفل الملف.أعتقد أنه يمكنك استخدام شيء مثل

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 ...) { ... }

و(كملاحظة جانبية، وأود أن تشديد الصيد محاولة للتو. حفظ () و / أو SystemParametersInfo () يدعو)

نصائح أخرى

بمجرد خروجك من استخدام كتلة، يتم التخلص من كافة الكائنات التي تمت تهيئتها داخلها.في حالتك، سيتم التخلص من الكائنات مما سيؤدي إلى إزالة القفل الموجود على الملف.

يجب عليك التخلص يدويًا (إما من خلال ملف استخدام بيان أو عن طريق الاتصال .تخلص() على الكائن) أي مكالمات غير مُدارة إلى وظائف 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");
                    }
                }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top