다른 프로세스에서 사용 중인 파일 삭제
프로그램을 통해 파일을 삭제하려고 하는데 다른 프로세스에서 파일을 사용하고 있는 것 같습니다(실제로 사용하고 있는 프로그램).기본적으로 프로그램은 FromUri를 사용하여 이미지를 폴더에서 로드하고 비트맵을 만든 다음 이미지 배열에 로드되며, 이미지 배열은 스택 패널의 하위 항목이 됩니다.효율적이진 않지만 효과가 있어요
스택패널의자체를클리어하고어레이내의이미지를null로해봤지만, IOException이 표시되어 파일이 다른 프로세스에서 사용되고 있는 것을 알 수 있습니다.
신청 프로세스에서 파일을 삭제할 수 있는 다른 방법이 있나요?
가비지 컬렉션 문제일 수 있습니다.
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
File.Delete(picturePath);
로드 후 이미지 파일을 릴리스하려면 다음 설정을 사용하여 이미지를 생성해야 합니다.BitmapCacheOption.OnLoad플래그를 사용하는 방법 중 하나는 다음과 같습니다.
string filename = ...
BitmapImage image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = new Uri(filename);
image.EndInit();
설정이지만BitmapCacheOption.OnLoad로컬 파일 URI에서 로드된 비트맵이미지로 동작합니다.이것은 문서화되어 있지 않습니다.따라서 파일 스트림에서 이미지를 로드하는 것이 더 낫거나 안전한 방법일 수 있습니다.StreamSource대신 재산UriSource:
string filename = ...
BitmapImage image = new BitmapImage();
using (var stream = File.OpenRead(filename))
{
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.StreamSource = stream;
image.EndInit();
}
다른 방법은 파일을 삭제하는 것입니다.FileStream 클래스를 사용하여 파일을 로드하고 스트림을 통해 파일을 릴리스합니다.Dispose(): "The process cannot access the file " (프로세스가 다른 프로세스에서 사용되고 있기 때문에 파일에 액세스할 수 없습니다)"라는 예외는 표시되지 않습니다.
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!
저도 비슷한 문제가 있었어요.다른 점은 Binding(MVVM Pattern)을 사용한다는 점뿐입니다.별 효과가 없어서 모든 것을 제거하고 Binding을 시도했습니다.Mode=OneWay와 함께GC.Collect()부르기 전에File.Delete(path)드디어 성공했어요.
저도 같은 문제가 있었어요.문제는 open FileDialog와 save FileDialog가 다음과 같이 설정되어 있다는 것입니다.
MyDialog.AutoUpgradeEnabled = false;
나는 그 대사를 코멘트하고 해결했다.
저 같은 경우에는 devenv.exe가 임시 솔루션 파일을 여는 새로운 프로세스를 시작했습니다.프로세스가 종료된 후 몇 분 동안 디렉토리를 삭제할 수 없었습니다.리소스 모니터인 "resmon"에서 확인해보니 Perf Watson2라는 실행 파일입니다.exe가 temp 파일을 참조해 주세요.사이트를 보면 PerfWatson은 사실 Microsoft의 Visual Studio 고객 환경 개선 프로그램입니다.VS IDE를 종료한 후에도 일시적으로 사용한 파일 또는 디렉토리가 잠깁니다.해결책은 Visual Studio Customer Experience Improvement Program을 비활성화하는 것입니다.이것을 참조해 주세요.앱이 공개되면 이 문제는 문제가 되지 않습니다.그러나 디버깅 중에는 상당히 귀찮습니다.
언급URL : https://stackoverflow.com/questions/13262548/delete-a-file-being-used-by-another-process
'source' 카테고리의 다른 글
| LPCTR, LPCTTR 및 LPTSTR (0) | 2023.04.19 |
|---|---|
| Excel의 행 수를 데이터로 계산하는 방법은 무엇입니까? (0) | 2023.04.19 |
| 텍스트 파일에서 문자열 읽기 및 쓰기 (0) | 2023.04.19 |
| 한 필드의 날짜를 다른 필드의 시간과 결합하는 방법 - MS SQL Server (0) | 2023.04.19 |
| 'CELL TO THE LEFT'를 참조하기 위한 Excel 공식 (0) | 2023.04.19 |