2009-04-30 35 views
5

He reducido a este método, pero no entiendo por qué está bloqueando el archivo. Creo que podría utilizar algo como¿por qué este código bloquea mis archivos?

using(something) 
{ 

//do stuff here 
} 

pero no estoy seguro de que habría A) resuelve el problema o B) sea la forma correcta si lo hizo.

¿Alguna idea?

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

código actualizado

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

Respuesta

15

De MSDN: "El archivo permanece bloqueado hasta que se dispone la imagen". - así que sí, esto debe ser establecida por:

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

(Como nota al margen, me apriete el intento de captura de sólo el .Save() y/o SystemParametersInfo() llama)

+0

También me lanzo en: if (File.Exists (camino)) {..} – Nippysaurus

+0

@Nippysaurus: Me gustaría SetWallpaper() para lanzar, a mí mismo. –

+0

supongo que mi pregunta es cómo es eso diferente de cuando el método se terminó de ejecutar. ¿No debería eliminarse automáticamente la imagen después de que se complete? – Crash893

1

Una vez que pasar del usando el bloque, todos los objetos inicializados dentro de este se eliminan. En su caso, los objetos serán eliminados, lo que eliminará el bloqueo en el archivo.

Debe desechar de forma manual (ya sea a través de un comunicado usando o llamando .Dispose() en el objeto) llamadas no administrados ya sea a COM o funciones API de Windows (es decir, cuando se utiliza interoperabilidad).

+0

'using' only calls .Dispose() en la expresión dentro de los parens. –

+0

Gracias, probaré – Crash893

0

Esto es lo que tengo, por favor avíseme si ve algo que yo pueda arreglar. Pero funciona como un campeón, así que estoy bastante feliz.

   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

Esto debería comportarse igual que 'if (File.Exists (path)) using (Image imgInFile = Image.FromFile (path)) try {...} catch {...} '(no, finalmente). Pero eso es solo estilo. –

Cuestiones relacionadas