Đây là một ý tưởng thú vị, nhưng có điều gì đó về thiết kế này gây rắc rối cho tôi. Hãy tha thứ cho tôi nếu bạn đã giải quyết vấn đề này trong thiết kế của mình. Nhưng nếu thiết kế của bạn chỉ là một wrapper đơn giản xung quanh FileStream
, có một sự tinh tế nhưng, tôi nghĩ rằng, vấn đề quan trọng.
Nếu bạn đang xóa tệp khi luồng được đóng, điều đó có nghĩa là cách duy nhất để thực sự sử dụng dữ liệu trong tệp là nếu FileAccess
là ReadWrite
. Chính xác? Nói cách khác, bạn sẽ sử dụng các tập tin với mã trông như thế này:
using (TempFileStream t as new TempFileStream())
{
WriteDataToTempFile(t);
t.Seek(0, SeekOrigin.Begin);
ReadDataFromTempFile(t);
}
Vấn đề tôi thấy là ReadDataFromTempFile
được mong đợi các tập tin được mở để truy cập đọc, không đọc/ghi truy cập. Và điều này mở ra cánh cửa cho một số lỗi mà tôi nghĩ sẽ rất khó tìm. Hãy xem xét mã như thế này:
using (TempFileStream t as new TempFileStream())
{
MyClass o = new MyClass(o);
o.TempStream = t;
o.ProduceOutput();
t.Seek(0, SeekOrigin.Begin);
o.ProcessOutput();
}
... khi so sánh với điều này:
MyClass o = new MyClass();
string n = Path.GetTempFileName();
using (FileStream s = new FileStream(n, FileMode.Create, FileAccess.Write))
{
o.TempStream = t;
o.ProduceOutput();
}
using (FileStream s = new FileStream(n, FileMode.Open, FileAccess.Read))
{
o.TempStream = t;
o.ProcessOutput();
}
File.Delete(n);
Chắc chắn, phương pháp đầu tiên là ngắn hơn so với thứ hai. Nhưng phương pháp thứ hai sẽ ném một ngoại lệ nếu ProcessOutput
gọi một phương thức ghi đến TempStream
. (Hoặc thiết lập một thuộc tính có accessor set đặt ra một sự kiện mà trình xử lý sự kiện gửi một cuộc gọi đến một phương thức ghi tới TempStream
, cách mà vấn đề này có thể sẽ xảy ra.) Đầu tiên sẽ tạo ra các kết quả không mong muốn mà không có lý do rõ ràng.
Bạn có thể giải quyết vấn đề này, bằng cách yêu cầu lớp học TempFileStream
mở lớp cơ bản FileStream
bằng cách sử dụng FileAccess.Write
. Sau đó, triển khai phương thức Rewind
đóng FileStream
này và tạo phương thức mới sử dụng FileAccess.Read
. Nếu bạn làm điều đó, bất kỳ phương pháp nào cố gắng ghi vào tệp trong khi nó được mở để truy cập đọc (hoặc ngược lại) sẽ ít nhất là ném một ngoại lệ.
Bạn phải sử dụng FileStream cho điều này, bạn không thể sử dụng MemoryStream? Bằng cách đó bạn không phải xử lý tất cả các vấn đề có thể có liên quan đến việc xóa tệp. – armannvg
@armannvg, bạn đang nói về vấn đề gì? Đó là một lưu trữ tạm thời cho các tập tin rất lớn trước khi nó được ghi vào cơ sở dữ liệu. – sh0gged
Chỉ cần các tập tin bình thường xóa các vấn đề -> IOException, UnauthorizedAccessException vv Nhưng nếu bạn đang làm việc với một tập tin rất lớn, thì MemoryStream không phải là một lựa chọn – armannvg