2016-03-31 9 views
3

Question編集済み!これは私の問題を見つけるのに役立つcompilabileファイルの例です! いくつかのスクリーンショットを特定のファイルに保存します。 私はDeleteFile()関数を使用すると最初に内容を削除してからフォルダを削除する必要がありますが、 "そのicon.jpgは別のプロセスで使用されています"というメッセージが表示されます。 (いずれかの方法では、それは内容を持たないために持っているフォルダを削除するには!)JPEGを削除できない(別のプロセスで使用)

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()を使用)

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

のForm1.cs(メイン)

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 +は画像が適切に処理されるまでファイルを使用し続けます。 –

+0

私はimage.Dispose()を使用しました。 PrintScreen()関数では、私は同じ問題があります!これを挿入する正しい行ですか? –

+1

試してみてください(var image ....)。あなたが持っている問題は、ほとんど存在しません。なぜなら、どこにも配置されていないイメージオブジェクトがあるからです。 –

答えて

0

私は前にこの問題を抱えていると私はその後、ロード、のMemoryStreamにファイルストリームからの画像データをコピーして、それを解決そこからの画像。同様に画像を保存する。この方法では、Imageがソースまたは保存されたストリームへの参照を保持していても、それは物理ファイルではありません。

より完全なソリューション:http://siderite.blogspot.com/2011/02/imagefromstream-or-imagefromfile.html

試してみてください。

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

私はそれが正確に動作しない場合ので、それを微調整し、このインラインを書きました。

+0

あなたのヘルパーで新しいクラスファイルを作成すると、どのコマンドを使うべきですか?(私はそれほどプログラミングがうまくないので混乱します)、時間があれば私はそれをお願い申し上げます! –

+0

私のクラスは、ファイルの読み込みに固有です。あなたの場合(保存)、メモリストリームを使用してみてください。 –

+0

そのようなPrintScreen()関数を編集しましたが、まだエラーがあります –

関連する問題