2012-11-11 48 views
7

Tôi đã thấy nhiều vấn đề như thế này đã được giải quyết và vấn đề chủ yếu là do luồng không được xử lý đúng cách."Quá trình không thể truy cập tệp vì nó đang được sử dụng bởi một quá trình khác" với Hình ảnh

Vấn đề của tôi là hơi khác nhau, ở đây theo một đoạn mã

foreach (Images item in ListOfImages) 
{ 
     newPath = Path.Combine(newPath, item.ImageName + item.ImageExtension); 
     File.Create(newPath); 

     File.WriteAllBytes(newPath, item.File); 
} 

đâu Images là một cấu trúc tùy chỉnh và item.File là dữ liệu thô, byte [].

Vấn đề của tôi là tại dòng nơi số WriteAllBytes được gọi, ngoại lệ được ném. Thông điệp đọc:

The process cannot access the file because it is being used by another process

Một lần nữa tôi không có đầu mối như thế nào tôi sẽ bằng cách nào đó close quá trình này.

+0

Một số hình ảnh có cùng ImageName và ImageExtension không? –

+0

Bạn có chắc chắn, là đường dẫn newPath tồn tại? –

+2

xóa 'File.Create (newPath);' và thử. File.WriteAllBytes: 'Tạo một tệp mới, ghi mảng byte đã chỉ định vào tệp và sau đó đóng tệp. Nếu tập tin mục tiêu đã tồn tại, nó sẽ bị ghi đè. 'Http://msdn.microsoft.com/en-us/library/system.io.file.writeallbytes.aspx –

Trả lời

18

Kể từ File.Create lợi nhuận dòng tôi sẽ vứt bỏ nó đúng cách:

using(var stream = File.Create(newPath)){} 
File.WriteAllBytes(newPath, item.File); 

hoặc bạn có thể sử dụng các dòng để ghi vào tập tin trực tiếp:

using (FileStream fs = File.Create(newPath)) 
{ 
    fs.Write(item.File, 0, item.File.Length); 
} 

hoặc, có lẽ là dễ nhất, chỉ sử dụng File.WriteAllBytes một mình:

File.WriteAllBytes(newPath, item.File); 

Tạo một tập tin mới, viết mảng byte quy định để các tập tin, và sau đó đóng tập tin. Nếu tệp đích đã tồn tại, nó bị ghi đè .

+0

This ... File.WriteAllBytes (newPath, item.File); làm việc hoàn hảo. Cảm ơn – Scriptworks

4

Bạn trạng thái đó vấn đề của bạn không có gì để làm với các luồng xử lý nhưng kiểm tra bài viết này MSDN:

http://msdn.microsoft.com/en-us/library/d62kzs03.aspx

File.Create trở lại? Một FileStream !!!!

Và, vào cuối ngày, tại sao bạn sử dụng File.Create nếu File.WriteAllBytes tạo tệp nếu điều này không tồn tại? ;)

Tạo tệp mới, ghi mảng byte được chỉ định vào tệp và sau đó đóng tệp. Nếu tệp đích đã tồn tại, nó bị ghi đè .

Kiểm tra nó trên MSDN quá: http://msdn.microsoft.com/en-us/library/system.io.file.writeallbytes.aspx

1

Mở create method mở tệp để viết và trả về đối tượng FileStream để bạn làm việc. Chỉ vì bạn không tham chiếu nó không có nghĩa là bạn không cần phải trả lại.

foreach (Images item in ListOfImages) 
       { 
        newPath = Path.Combine(newPath, item.ImageName + item.ImageExtension); 
        FileStream f = File.Create(newPath); 

        f.Write(item.File, 0, item.File.Length); 
       } 
0

File.WriteAllBytes tạo tệp nếu cần.Bạn có thể sử dụng tính năng:

foreach (Images item in ListOfImages) 
{ 
    newPath = Path.Combine(newPath, item.ImageName + item.ImageExtension); 
    File.WriteAllBytes(newPath, item.File); 
} 

Và bạn có kết hợp đường dẫn chính xác không?

0

Đây là cách cụ thể nhất để hoàn thành những gì bạn đang cố gắng để làm:

foreach (Images item in ListOfImages) 
{ 
    using (System.IO.FileStream output = new System.IO.FileStream(Path.Combine(newPath, item.ImageName + item.ImageExtension), 
     System.IO.FileMode.Create, System.IO.FileAccess.Write)) 
    { 
     output.Write(item.File, 0, item.File.Length); 
     output.Flush(); 
     output.Close(); 
    } 
} 

Bạn cũng cần phải sửa chữa logic của bạn để tạo ra con đường, mà tôi đã làm trong ví dụ của tôi ở trên. Bạn đã ghép nối lại newPath.

1
using (FileStream fs = 
new FileStream(filePath, 
    FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 

Nhật ký của bạn có thể bị khóa, vì vậy hãy thử với FileShare.ReadWrite.

-1

Buộc bộ thu gom rác sạch.

GC.Collect();

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