C#File.Delete、別のプロセスで使用されているファイル
-
03-07-2019 - |
質問
画像ファイルを削除しようとすると問題が発生します。 IOExeptionが処理されなかったというエラーが常に表示されます。ファイルが別のプロセスによって使用されているため、アクセスは拒否されました。
どのようなプロセスになる可能性があり、どのように解決するかはわかりません。
private void comboBox3_SelectedIndexChanged(object sender, EventArgs e) { Album album = GetAlbum(comboBox1.SelectedIndex); Photo photo = GetPhoto(comboBox1.SelectedIndex, comboBox3.SelectedIndex); txtPhotoPath.Text = Directory.GetCurrentDirectory() + "\\" + photo.SPath; lblExtention.Text = photo.SExtention; txtPhotoTitle.Text = photo.STitle; pctrbFoto.Image = Image.FromFile(foto.SPath).GetThumbnailImage(GetWitdth(photo.SPath, GetHeight(photo.SPath, 150)), GetfHeight(photo.SPath, 150), null, new IntPtr()); } private void btnChangePhoto_Click(object sender, EventArgs e) { Album album = GetAlbum(comboBox1.SelectedIndex); Photo photo = GetPhoto(comboBox1.SelectedIndex, comboBox3.SelectedIndex); File.Delete("Albums\\Images\\" + photo.STitle + foto.SExtention); photo.SExtention = lblExtention.Text; photo.STitle = txtPhotoTitel.Text; Photo.SPath = txtPath.Text; File.Copy(photo.SPath, "Albums\\Images\\" + photo.STitle + photo.SExtention); }
ありがとう、 ビンツセント
助けてくれたすべての人に感謝します。
これを使用し、現在非常にうまく機能しています
あなたのプロセスはfileを使用するプロセスで、次のようなものを使用して画像をnullに設定する必要があります:
var img = Image.FromFile(foto.SPath).GetThumbnailImage(GetWitdth(photo.SPath、 GetHeight(photo.SPath、150))、GetfHeight(photo.SPath、150)、null、new IntPtr());
pctrbFoto.Image = img;
img = null;
GC.Collect();
解決
あなたのプロセスはfileを使用するプロセスです。イメージをnullに設定する必要があります このようなものを使用してください:
using(var img = Image.FromFile(foto.SPath).GetThumbnailImage(GetWitdth(photo.SPath, GetHeight(photo.SPath, 150)), GetfHeight(photo.SPath, 150), null, new IntPtr()))
pctrbFoto.Image = img;
他のヒント
最初に確認するのは、GetPhotoメソッドです。閉じられていないStreamReaderがありますか?削除の前にファイルに対して何らかのI / Oを行っている場合は、それらの接続を最初に閉じてください。 GetPhoto()メソッドは何をしますか?
サムネイルを使用する場所:
using(Image img = Image.FromFile(foto.SPath))
{
pctrbPhoto. Image = img.GetThumbnailImage(
GetWitdth(photo.SPath, GetHeight(photo.SPath, 150)),
GetfHeight(photo.SPath, 150), null, new IntPtr());
}
代わりに、ソースイメージが終了したときにソースイメージが破棄される(閉じられる)ようにします。
その方法では、ファイルからロードされたイメージは、ガベージコレクターがそれをリリースすることを決定するまで残ります。
FromFileで読み込まれた画像は、開いた状態から読み込まれたファイルを保持します。
まず、それがあなたのアプリケーションであるか、ファイルを開いている別のアプリケーションであるかを判断する必要があります。
Mark RussinovichのProcess Explorerを使用して、特定のファイルまたはディレクトリが開いているプログラムを確認できます。これは、すべてのプログラマ/ ITプロフェッショナルが使用する(または少なくとも意識する)べきWindows Sysinternalsの優れたユーティリティラインの一部です。
ここから入手できます: http://technet.microsoft.com /en-us/sysinternals/bb896653.aspx
comboBox3_SelectedIndexChanged
で Image.FromFile
を呼び出すとき、およびおそらく他の場所でも、 Image
オブジェクトを破棄しません。したがって、プログラムはファイルを使用し続けています。
画像を開くたびに破棄する必要があります。
他のすべてが失敗した場合は、 MoveFileEx 次の再起動時にファイルを削除します。
Unlockerプログラムを使用して、どのプログラムでファイルがロックされているかを知ることができます
注: Unlockerプログラムへのリンクを削除-マルウェアが含まれています。
...しかし、アプリケーションがWebホスティングプランで実行されている場合はどうでしょうか?共有サーバーでソフトウェアを実行することはできません。
dispose()およびその他のオプションを試しましたが、Vinzcentのようなファイルを削除できません。
Maldito IIS:@
かつて thestar や Sadegh のようなものを使用したことがあります しかし、いくつかのケースではうまくいかなかったので、別の解決策を見つけました こちら
ここでもコード(リンクと質問を見た後、uはよりよく理解するかもしれません):
var imageAsByteArray = File.ReadAllBytes(imagePath);
// I use as example a pictureBox:
pictureBox1.Image = byteArrayToImage(imageAsByteArray);
// Or/and safe/copy/replace it:
File.WriteAllBytes(picture_Path, imageAsByteArray);
(新しい)画像をすぐに削除することもできます! (必要な場合)