2009-04-30 8 views
5

Iveはこの方法に絞られましたが、なぜファイルをロックするのか分かりません。私はあなたがそれがなかった場合は、正しい方法であること)このコードはなぜ私のファイルをロックするのですか?

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

更新されたコードは

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

答えて

15

: "イメージが配置されるまで、ファイルがロックされたままになります。" - そうそう、これがで固定する必要があります:あなたいったん

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

(注意点として、私はちょうど.SAVE()および/またはてSystemParametersInfo()の呼び出ししようとキャッチを締めます)

+0

私はまたに投げるだろう:(File.exists(パス))場合は{..} – Nippysaurus

+0

@Nippysaurus:私はSetWallpaper()、自分自身をスローするようにしたいと思います。 –

+0

私の質問は、メソッドの実行が終了したときとどう違うのかと思います。完了後にイメージが自動的に廃棄されるべきではありませんか? – Crash893

1

ブロックを使用してを渡すと、ブロック内で初期化されたすべてのオブジェクトが破棄されます。あなたの場合は、オブジェクトが破棄され、ファイル上のロックが削除されます。

(あなたが相互運用機能を使用する場合、すなわち)は、手動で(ステートメントを使用してを介して、またはオブジェクト上.Dispose()を呼び出すことによってのいずれか)COMまたはWindows API関数への任意の管理対象外の呼び出しを配置し​​なければなりません。

+0

'using'は括弧内の式に対して.Dispose()を呼び出すだけです。 –

+0

ありがとうございます。 – Crash893

0

ここでは、あなたが私がかなり上手くいくものがあれば教えてください。しかし、チャンピオンのように働くので、私はかなり幸せです。

   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

これは、(画像imgInFile = Image.FromFile(path))を使用してif(File.Exists(path))と同じように動作します{...} catch {...} '(最終的には)。しかし、それだけでスタイル。 –

関連する問題