2010-07-15 28 views
7

chúng tôi chạy một số trường hợp của chương trình của chúng tôi (C#) trên một máy tính duy nhất. Trong mỗi trường hợp, mã của chúng tôi cố tạo các tệp tạm thời "nhiều" với sự trợ giúp của phương thức Path.GetTempFile(). Và đôi khi, chương trình của chúng tôi không thành công với ngoại lệ:Path.GetTempFileName trong MultiProcessing

Exception: Access to the path is denied. 
StackTrace: at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
    at System.IO.Path.GetTempFileName() 

Tôi đã kiểm tra thư mục tạm thời và không tìm thấy một cái gì đó kỳ lạ: đĩa miễn phí là đủ, số lượng tập tin tạm thời không phải là rất lớn, vv

tôi chỉ có một lời giải thích: một cá thể có tệp tạm thời và mở nó, nhưng trong cùng một thời gian, một cá thể khác cũng lấy tên của tệp tạm thời và cố gắng mở nó. Nếu đúng? Nếu có, làm thế nào để giải quyết vấn đề, nếu không làm thế nào để hiểu những gì một vấn đề?

UPD: không thành công trên máy tính với Windows Server 2008 HPC

Cảm ơn bạn, Igor.

+0

Tôi không nghĩ là vậy. Nếu phương thức 'GetTempFileName' không an toàn thread hoặc không tạo ra một tên ngẫu nhiên, nó sẽ không có ở đó. Không phải là tôi biết nguyên nhân chính xác là gì ... – Noldorin

+0

Để loại bỏ những gì bạn nghĩ có thể là nguyên nhân, chỉ cần làm một * nếu (Directory.Exists (myTempFolderName)) * trước khi bạn tạo thư mục tạm thời - nếu nó tồn tại sau đó tạo ra một tên mới. – slugster

+0

Bạn có nghĩa là, nó không phải là thực hành tốt để sử dụng Path.GetTempFileName()? Nếu phương pháp không "đa luồng hoặc quá trình lưu", chúng tôi có thể sử dụng phương pháp này như thế nào? khi tôi cần thư mục tạm thời với tiện ích mở rộng đặc biệt, tôi sử dụng Hướng dẫn để tạo tên tệp duy nhất. – constructor

Trả lời

4

msdn bang cho lớp Path:

Bất kỳ public static (chung trong Visual Basic) thành viên của loại này là chủ đề an toàn.

Furthermore có hai lý do đưa ra cho trường hợp ngoại lệ IO:

  1. Phương pháp GetTempFileName sẽ nâng cao một IOException nếu nó được sử dụng để tạo ra hơn 65.535 tập tin mà không xóa các tập tin tạm thời trước.

  2. Phương thức GetTempFileName sẽ tăng IOException nếu không có tên tệp tạm thời duy nhất. Để giải quyết lỗi này, hãy xóa tất cả các tệp tạm thời không cần thiết.

tôi khuyên bạn nên để kiểm tra các điều kiện này (kể từ khi bạn rõ ràng nêu mà bạn tạo nhiều file tạm).

+0

Tôi đã kiểm tra thư mục tạm thời của cửa sổ. Tôi không tìm thấy hơn 1000 tệp trong thư mục."Nhiều" trong trường hợp của chúng tôi có nghĩa là có thể 200-300 tệp tạm thời (hoàn toàn) khi tất cả các phiên bản bắt đầu hoạt động. Vì tôi hiểu "chủ đề an toàn" không tương đương với "lưu quá trình đa". chúng tôi có một số trường hợp (quy trình, không phải chủ đề). – constructor

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