web-dev-qa-db-ja.com

別のプロセスが使用しているファイルを削除する

プログラムでファイルを削除しようとしていますが、ファイルは別のプロセス(たまたま私のプログラムです)によって使用されているようです。基本的に、プログラムはFromUriを使用してフォルダーから画像をロードし、ビットマップを作成してから、イメージ配列にロードして、スタックパネルの子になります。あまり効率的ではありませんが、機能します。

Stackpanelの子をクリアして、配列内の画像をnullにしようとしましたが、ファイルが別のプロセスで使用されていることを通知するIOExceptionを受け取っています。

アプリケーションのプロセスからファイルを削除する他の方法はありますか?

23
bramco

ロード後にイメージファイルを解放するには、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();
}
22
Clemens

ガベージコレクションの問題である可能性があります。

System.GC.Collect(); 
System.GC.WaitForPendingFinalizers(); 
File.Delete(picturePath);
94
kplshrm7

別の方法は、ファイルを削除することです。 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);
7
Shahid Manzoor
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!
2