2016-03-31 10 views
3

Frage bearbeitet !! Dies ist ein Beispiel für kompilierbare Dateien, die Ihnen helfen, mein Problem zu finden! Ich speichere einige Screenshots in einer bestimmten Datei. Wenn ich die Funktion DeleteFile() benutze, sollte sie zuerst den Inhalt und dann den Ordner löschen, aber dann bekomme ich "this icon.jpg wird von einem anderen Prozess verwendet"! (oder so einen Ordner löschen hat sie keinen Inhalt haben!)Löschen JPEG nicht zulässig (von einem anderen Prozess verwendet)

ImageExtensions.cs

using System.Drawing; 
using System.Drawing.Imaging; 
using System.IO; 
namespace name 
{ 
    static class ImageExtensions 
    { 
     public static void SaveToFile(Image image,string path,ImageFormat format) 
     { 
      using (var stream = File.OpenWrite(path)) 
      { 
       image.Save(stream, format); 
      } 

     } 
    } 
} 

ScreenCapture.cs

using System; 
using System.Drawing; 
using System.Runtime.InteropServices; 

namespace name 
{ 
    public class ScreenCapture 
    { 

     [DllImport("user32.dll")] 
     private static extern IntPtr GetForegroundWindow(); 

     [DllImport("user32.dll")] 
     private static extern IntPtr GetWindowRect(IntPtr hWnd, ref Rect rect); 

     [StructLayout(LayoutKind.Sequential)] 
     private struct Rect 
     { 
      public int Left; 
      public int Top; 
      public int Right; 
      public int Bottom; 
     } 

     [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] 
     public static extern IntPtr GetDesktopWindow(); 


     public static Image CaptureDesktop() 
     { 
      return CaptureWindow(GetDesktopWindow()); 
     } 

     public static Bitmap CaptureActiveWindow() 
     { 
      return CaptureWindow(GetForegroundWindow()); 
     } 


     public static Bitmap CaptureWindow(IntPtr handle) 
     { 
      var rect = new Rect(); 
      GetWindowRect(handle, ref rect); 
      var bounds = new Rectangle(rect.Left, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top); 
      var result = new Bitmap(bounds.Width, bounds.Height); 

      using (var graphics = Graphics.FromImage(result)) 
      { 
       graphics.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size); 
      } 

      return result; 
     } 
    } 
} 

AnotherFile.cs (Verwendet PrintScreen())

public void PrintScreen() 
{ 
    using (var image = ScreenCapture.CaptureDesktop()) 
    { 
     ImageExtensions.SaveToFile(image, (file_images + ".jpg"), ImageFormat.Jpeg); 
    } 
} 

Form1.cs (Haupt)

using ... 
using ... 

namespace name{ 

    public partial class Form1 : Form 
    { 
    const int MaxRetries = 3; 
    const int DelayBetweenRetries = 1000; 
    const int ERROR_SHARING_VIOLATION = unchecked((int)0x80070020); 
    string file_images = my_path_of_images_file; 

    Public Form1() 
    { 
     InitializeComponent(); 
     CreateFile(); 
    } 

    private void Form1_Load(object sender, EventArgs e){} 

    public void CreateFile() 
    { 
     if (!Directory.Exists(file_images)) 
     { 
      DirectoryInfo di = Directory.CreateDirectory(file_images); 
     } 
    } 


    public void DeleteFiles() 
    { 
     string[] filesToDelete = Directory.GetFiles(file_images); 
     if (filesToDelete != null) 
     { 
      var files = filesToDelete.Where(x => Path.GetExtension(x).Contains(".jpg")); 
       foreach (var file in files) 
       { 
        var temp = file; 
        DeleteFile(temp); // Delete JPEG 
       } 
      } 
     Directory.Delete(file_images); // Delete Folder 
    } 


    public static void DeleteFile(string path) 
    { 
     for (int i = 0; i < MaxRetries; ++i) 
     { 
      try 
      { 
       File.Delete(path); 
      } 
      catch (IOException e) 
      { 
       // You may also sleep whatever the error is... 
       if (Marshal.GetHRForException(e) == ERROR_SHARING_VIOLATION) 
       { 
        Thread.Sleep(DelayBetweenRetries); 
        continue; 
       } 
       throw; 
      } 
      } 
     } 
    } // End Of Main.cs 
} // End Of Namespace 
+1

GDI + Datei wird verwendet, bis Bild ordnungsgemäß entsorgt wird ... –

+0

Ich habe image.Dispose() verwendet; in PrintScreen() Funktion, aber ich habe das gleiche Problem! Ist das die richtige Zeile um das einzufügen? –

+1

versuchen Sie es mit (var Bild ....). Das Problem, das Sie haben, wird fast immer verursacht, weil es ein Bildobjekt _irgendwo_ gibt, das nicht entsorgt wird. –

Antwort

0

Ich hatte dieses Problem vor und ich löste es durch Kopieren der Bilddaten aus dem Filestream in einen Memorystream, dann laden das Bild von ihm. Ähnlich mit dem Speichern des Bildes. Auf diese Weise ist Image auch dann eine physische Datei, wenn Image einen Verweis auf die Quelle oder den gespeicherten Stream enthält.

Eine vollständigere Lösung: http://siderite.blogspot.com/2011/02/imagefromstream-or-imagefromfile.html

Versuch:

using (var ms=new MemoryStream()) { 
    image.Save(ms,format); 
    File.WriteAllBytes(path,ms.ToArray()); 
} 

Ich schrieb dieses inline, also ist es zwicken, wenn sie nicht genau funktioniert.

+0

Wenn ich eine neue Klassendatei mit Ihrem Helfer mache, welche Befehle sollte ich verwenden? (Ich bin nicht so gut in der Programmierung, es ist irgendwie verwirrend), wenn Sie Zeit und Willen haben ich würde es schätzen! –

+0

Meine Klasse ist spezifisch zum Laden einer Datei. Versuchen Sie für Ihren Fall (Speichern), einen Speicherstream zu verwenden. –

+0

Ich habe meine PrintScreen() -Funktion so bearbeitet, aber immer noch einen Fehler bekommen –

Verwandte Themen