プログラムでファイルを削除しようとしていますが、ファイルは別のプロセス(たまたま私のプログラムです)によって使用されているようです。基本的に、プログラムはFromUriを使用してフォルダーから画像をロードし、ビットマップを作成してから、イメージ配列にロードして、スタックパネルの子になります。あまり効率的ではありませんが、機能します。
Stackpanelの子をクリアして、配列内の画像をnullにしようとしましたが、ファイルが別のプロセスで使用されていることを通知するIOExceptionを受け取っています。
アプリケーションのプロセスからファイルを削除する他の方法はありますか?
ロード後にイメージファイルを解放するには、BitmapCacheOption.OnLoad
フラグを設定してイメージを作成する必要があります。これを行う1つの方法は次のとおりです。
string filename = ...
BitmapImage image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = new Uri(filename);
image.EndInit();
BitmapCacheOption.OnLoad
の設定は、ローカルファイルUriからロードされたBitmapImageで機能しますが、これはどこにも文書化されていません。したがって、おそらくより良いまたはより安全な方法は、StreamSource
の代わりにUriSource
プロパティを設定することにより、FileStreamから画像をロードすることです。
string filename = ...
BitmapImage image = new BitmapImage();
using (var stream = File.OpenRead(filename))
{
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.StreamSource = stream;
image.EndInit();
}
ガベージコレクションの問題である可能性があります。
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
File.Delete(picturePath);
別の方法は、ファイルを削除することです。 FileStreamクラスを使用してファイルをロードし、stream.Dispose()を使用してファイルを解放します。 「プロセスはファイルにアクセスできません」という例外は決して発生しません ''別のプロセスによって使用されているためです。
using (FileStream stream = new FileStream("test.jpg", FileMode.Open, FileAccess.Read))
{
pictureBox1.Image = Image.FromStream(stream);
stream.Dispose();
}
// delete your file.
File.Delete(delpath);
var uploadedFile = Request.Files[0]; //Get file
var fileName = Path.GetFileName(uploadedFile.FileName); //get file name
string fileSavePath = Server.MapPath(fileName); //get path
uploadedFile.SaveAs(fileSavePath); //saving file
FileInfo info = new FileInfo(fileSavePath);//get info file
//the problem ocurred because this,
FileStream s = new FileStream(fileSavePath, FileMode.Open); //openning stream, them file in use by a process
System.IO.File.Delete(fileSavePath); //Generete a error
//problem solved here...
s.Close();
s.Dispose();
System.IO.File.Delete(fileSavePath); //File deletad sucessfully!