37

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

スタックパネルの子をクリアし、配列内の画像を null にしようとしましたが、ファイルが別のプロセスによって使用されていることを示す IOException が引き続き表示されます。

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

4

6 に答える 6

133

ガベージコレクションの問題かもしれません。

System.GC.Collect(); 
System.GC.WaitForPendingFinalizers(); 
File.Delete(picturePath);
于 2014-01-15T12:16:48.840 に答える
28

ロード後に画像ファイルを解放するには、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代わりにプロパティを設定して、FileStream からイメージをロードすることですUriSource

string filename = ...
BitmapImage image = new BitmapImage();

using (var stream = File.OpenRead(filename))
{
    image.BeginInit();
    image.CacheOption = BitmapCacheOption.OnLoad;
    image.StreamSource = stream;
    image.EndInit();
}
于 2012-11-07T07:40:44.750 に答える
11

別の方法は、ファイルを削除することです。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);
于 2013-06-15T08:02:35.767 に答える
3
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!
于 2016-04-06T15:39:32.050 に答える