2009-05-01 24 views
5

Tôi gặp sự cố khi cố gắng xóa tệp hình ảnh. Tôi luôn nhận được thông báo lỗi: IOExeption không được xử lý. Acces bị từ chối vì tập tin đang được sử dụng bởi một quá trình khác.C# File.Delete, tệp đang được sử dụng bởi một quy trình khác

Tôi không biết quy trình nào có thể và cách giải quyết.

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); 

}

Cảm ơn, Vinzcent


Nhờ tất cả cho sự giúp đỡ.

tôi đã sử dụng này và nó hoạt động rất tốt tại


quá trình của bạn là một trong đó sử dụng tập tin, bạn cần phải thiết lập hình ảnh null sử dụng một cái gì đó như thế này:

var img = Image. FromFile (foto.SPath) .GetThumbnailImage (GetWitdth (photo.SPath, GetHeight (photo.SPath, 150)), GetfHeight (photo.SPath, 150), null, mới IntPtr());

pctrbFoto.Image = img;

img = null;

GC.Collect();

Trả lời

2

quá trình của bạn là một trong đó sử dụng tập tin, bạn cần phải thiết lập hình ảnh null sử dụng một cái gì đó như thế này:

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; 
+6

Nói chung, bạn nên gọi GC.Collect: http://blogs.msdn.com/ricom/archive/2004/11/29/271829.aspx Vì Hình ảnh triển khai IDisposable, bạn nên gọi hàm img.Dispose() thay vào đó, hoặc (tốt hơn) sử dụng khối "đang sử dụng". –

+1

yes u r right;) – Sadegh

6

Khu vực đầu tiên tôi sẽ xem xét trong phương pháp GetPhoto của bạn. Bạn có một StreamReader chưa được đóng? Hãy chắc chắn rằng nếu bạn đang làm bất kỳ loại I/O trên tập tin trước khi xóa mà bạn đóng những kết nối đầu tiên. Phương thức GetPhoto() làm gì?

3

Trước tiên, bạn cần xác định xem đó là ứng dụng hoặc ứng dụng khác có tệp đang mở.

Bạn có thể sử dụng Process Explorer của Mark Russinovich để xem chương trình nào có tệp hoặc thư mục cụ thể mở. Nó là một phần của dòng Windows Sysinternals của các tiện ích tuyệt vời mà mỗi lập trình viên/chuyên gia CNTT nên sử dụng (hoặc ít nhất là nhận thức được).

Bạn có thể lấy nó ở đây: http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

+0

Tôi đồng ý. Nhưng tôi không thấy các tùy chọn để hiển thị các chương trình tập tin đang sử dụng. – TamusJRoyce

0

bạn có thể sử dụng chương trình Unlocker để cho bạn biết những gì chương trình (s) có tập tin bị khóa

Lưu ý: Removed liên kết đến chương trình Unlocker - chứa phần mềm độc hại.

+0

Bạn cũng có thể sử dụng Process Explorer để cho bạn biết (các) chương trình nào đã bị khóa (http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx) – Brian

+0

Cũng giống như một lưu ý, phần mềm Unlocker không Không chứa phần mềm độc hại ... –

2

Khi bạn gọi Image.FromFile trong comboBox3_SelectedIndexChanged và có thể ở nơi khác, bạn không được bỏ đối tượng Image. Do đó, chương trình của bạn đang giữ tệp đang sử dụng.

Bạn cần Vứt bỏ hình ảnh mỗi khi bạn mở nó.

1

Khi thất bại, bạn có thể sử dụng MoveFileEx để xóa tệp khi khởi động lại lần tiếp theo.

3

nơi bạn đang nhận được sử dụng thumbnail:

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()); 
} 

thay vì để đảm bảo rằng hình ảnh nguồn được xử lý (đóng cửa) khi bạn kết thúc với nó.

Chúng theo cách bạn có, hình ảnh được tải từ tập tin dính xung quanh cho đến khi người thu gom rác quyết định phát hành nó, có thể là một thời gian.

Hình ảnh được tải bằng FromFile giữ tệp mà chúng được tải từ mở.

0

... nhưng, nếu ứng dụng của bạn đang chạy trên một kế hoạch lưu trữ web? Bạn không thể chạy bất kỳ phần mềm nào trong một máy chủ được chia sẻ.

Tôi đã thử gỡ bỏ() và các tùy chọn khác, nhưng tôi không thể xóa các tệp như Vinzcent.

Maldito IIS: @

Các vấn đề liên quan