2009-09-18 4 views
7

Trong dự án của tôi, tôi phải tạo một số tệp tạm thời trong thiết bị USB, mà tôi muốn xóa khi đóng. Vì vậy, tôi đã sử dụng mã nhưFileStream với tùy chọn DeleteOnClose File

this.fcommandHandler = new FileStream(TempFileName, 
FileMode.CreateNew, FileAccess.ReadWrite, 
FileShare.ReadWrite, 512, FileOptions.DeleteOnClose); 

Nó hoạt động tốt. Nhưng vấn đề là tôi muốn sử dụng thêm một FileOption, như No buffering.

private const FileOptions FILE_FLAG_NO_BUFFERING = (FileOptions)0x20000000; 

this.fcommandHandler = new FileStream(TempFileName, 
FileMode.CreateNew, FileAccess.ReadWrite, 
FileShare.ReadWrite, 512, FileOptions.DeleteOnClose & FILE_FLAG_NO_BUFFERING); 

Nhưng không xóa tệp sau khi đóng. Hãy giúp tôi.

Trả lời

8

Bạn cần sử dụng | thay vì &.

Đây là các cờ nhị phân và khi bạn nói &, bạn sẽ che dấu hiệu quả tất cả chúng đi, kết quả là không có tùy chọn nào cả.

+0

Nhưng tôi nhận được một ngoại lệ "hoạt động IO sẽ không hoạt động. Nhiều khả năng tệp sẽ trở nên quá dài hoặc xử lý không được mở để hỗ trợ các hoạt động IO đồng bộ", nếu tôi đặt | thay vì &, khi tôi gọi this.fcommandHandler.Close() – Anuraj

+1

@Anuraj: Điều đó không có nghĩa là | là sai, nó có nghĩa là một cái gì đó trong cách sử dụng của bạn là không chính xác. Lasse là đúng mà bạn cần | thay vì &. Ngoại lệ là vấn đề tiếp theo của bạn để giải quyết. –

+0

@ Jeff Yates: Cảm ơn bạn đã thử với một số tùy chọn khác. – Anuraj

2

Sử dụng FileOptions.DeleteOnClose | FILE_FLAG_NO_BUFFING các & hủy chúng ra.

FILE_FLAG_NO_BUFFERING & FileOptions.DeleteOnClose trả FileOptions.None

+0

Vui lòng kiểm tra nhận xét của câu trả lời đầu tiên. – Anuraj

+0

@Anuraj: Tôi đang cố gắng tìm ra File_flag_no_buffering là gì, DeleteOnClose chắc chắn không được gọi vì bạn đang thực hiện và thay vì một hoặc. –

+0

@Yuriy Faktorovich - Tùy chọn tệp File_flag_no_buffering là một tùy chọn tệp, giúp tránh tệp bộ nhớ đệm khi đọc và ghi tệp, bởi Windows. Kiểm tra http://stackoverflow.com/questions/122362/how-to-empty-flush-windows-read-disk-cache-in-c – Anuraj

0

Cố gắng bao gồm WriteThrough cờ cũng trong một danh sách sử dụng | nhà điều hành. Xem điều này KB về các yêu cầu để sử dụng FILE_FLAG_NO_BUFFERING. Điều thú vị là MS không bao gồm lá cờ này trong enum. Có một lý do tại sao WriteThrough không làm những gì bạn cần trong trường hợp này? Bạn đang cố gắng ghi dữ liệu an toàn?

+0

@AnthonyWJones: Tôi đã thử cách này nhưng tôi vẫn gặp phải lỗi này. Tôi đang cố gắng đạt được là như: Tôi phải phát hành một số lệnh vào một USB thông qua một tập tin (ví dụ. Cmd.bin) thiết bị, và nó sẽ trả về một số phản ứng trong một tập tin (ví dụ res.bin). Nhưng nếu tôi sử dụng bình thường C# Stream Windows sẽ bộ nhớ cache phản ứng và luôn luôn tôi sẽ nhận được phản ứng tương tự, vì vậy tôi phải sử dụng cờ No Buffering. Và các tập tin là tạm thời vì vậy tôi phải xóa nó sau khi sử dụng, đó là lý do tại sao tôi đang sử dụng Delete On close flag. – Anuraj

+0

Trong trường hợp đó, câu hỏi mà Yuriy đã hướng đến bạn có một cách tiếp cận khác để mở một tập tin như vậy, tôi sẽ cho đi. – AnthonyWJones