2009-04-30 29 views
5

Ive thu hẹp xuống phương pháp này nhưng tôi không hiểu tại sao nó khóa tệp. Tôi tin rằng bạn có thể sử dụng một cái gì đó nhưtại sao mã này khóa tệp của tôi?

using(something) 
{ 

//do stuff here 
} 

Nhưng không chắc chắn A) giải quyết vấn đề hay B) là cách chính xác nếu có.

bất kỳ ý tưởng nào?

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

đang cập nhật

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

Trả lời

15

Từ MSDN: "Các tập tin vẫn bị khóa cho đến khi hình ảnh được xử lý." - vì vậy có, điều này cần được cố định bởi:

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

(Như một mặt lưu ý, tôi sẽ thắt chặt các catch để chỉ các lệnh .save() và/hoặc SystemParametersInfo() gọi)

+0

Tôi cũng sẽ ném vào: if (File.exists (path)) {..} – Nippysaurus

+0

@Nippysaurus: Tôi muốn SetWallpaper() tự ném. –

+0

tôi đoán câu hỏi của tôi là khác nhau như thế nào khi phương thức được chạy xong. sao hình ảnh không được tự động xử lý sau khi hoàn thành? – Crash893

1

Khi bạn vượt ra khỏi số sử dụng khối, tất cả các đối tượng được khởi tạo trong đó được xử lý. Trong trường hợp của bạn, các đối tượng sẽ được xử lý mà sẽ loại bỏ các khóa trên tập tin.

Bạn phải tự định đoạt (hoặc thông qua một sử dụng tuyên bố hoặc bằng cách gọi .Dispose() trên đối tượng) bất kỳ cuộc gọi không được quản lý hoặc là COM hoặc Windows API chức năng (ví dụ: khi bạn sử dụng interop).

+0

Chỉ sử dụng các cuộc gọi 'use' .Dispose() trên biểu thức bên trong các parens. –

+0

Cảm ơn tôi sẽ cho rằng một thử – Crash893

0

Đây là những gì tôi có xin vui lòng cho tôi biết nếu bạn thấy bất cứ điều gì mà tôi có thể khá lên. Nhưng nó hoạt động như một nhà vô địch nên tôi khá hạnh phúc.

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

Điều này sẽ hành xử giống như 'if (File.Exists (đường dẫn)) bằng cách sử dụng (Image imgInFile = Image.FromFile (đường dẫn)) try {...} catch {...} '(không cuối cùng). Nhưng đó chỉ là phong cách. –

Các vấn đề liên quan