2016-03-31 15 views
3

Question Edited !! Bu, sorunumu bulmanıza yardımcı olacak uyumlu dosyaların bir örneğidir! Bazı ekran görüntülerini belirli bir dosyada kaydediyorum. DeleteFile() işlevini kullandığımda, önce içeriği ve sonra klasörü silmeli ama sonra "o icon.jpg başka bir işlem tarafından kullanılıyor" ifadesini kullanmalıyım! (Bir klasörü silmek için iki şekilde de hiçbir içeriğe sahip olmalıdır!)JPEG Silme İzin Verilmiyor (Başka Bir İşlemde Kullanılıyor)

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 (PrintScreen() kullanır Daha önce bu sorun vardı

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 +, görüntü gerektiği gibi atılana kadar kullanımda tutar ... –

+0

image.Dispose(); PrintScreen() işlevinde ama aynı sorunu yaşıyorum! Bunu eklemek için doğru çizgi bu mu? –

+1

kullanmayı deneyin (var resim ....). Sahip olduğunuz problem neredeyse her zaman kaynaklanıyor çünkü imha edilmeyen _somewhere_ bir görüntü nesnesi var. –

cevap

0

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

Form1.cs (Ana) ve ardından yükleme, bir memorystream içine filestream gelen görüntü verilerini kopyalayarak münhal Bu görüntüden. Benzer şekilde görüntüyü kaydetme ile. Bu şekilde, Görüntü kaynağa veya kaydedilmiş akışa bir referans tutarsa ​​bile, bu fiziksel bir dosya değildir.

daha tam çözüm: http://siderite.blogspot.com/2011/02/imagefromstream-or-imagefromfile.html

deneyin:

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

Bu satır içi yazdım, bu yüzden tam olarak çalışmıyorsa değiştiririz.

+0

Eğer yardımcınız ile yeni bir sınıf dosyası oluşturursam, hangi komutları kullanmalıyım? (Programlamada o kadar iyi değilim, bu yüzden kafa karıştırıcı olabilir), eğer zamanınız varsa ve olacaksa Bunu takdir ediyorum! –

+0

Sınıfım bir dosyanın yüklenmesi hakkında spesifik. Durumunuz için (kaydetme), bir bellek akışı kullanmayı deneyin. –

+0

PrintScreen() işlevimi böyle düzenledim ancak yine de hatam var –

İlgili konular