FileStream с параметром DeleteOnClose File

В моем проекте мне нужно создать несколько временных файлов на USB-устройстве, которые я хочу удалить при закрытии. Поэтому я использовал код вроде

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

Это работает нормально. Но проблема в том, что я хочу использовать еще один FileOption, например 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);

Но это не удаление файла после закрытия. Пожалуйста помоги.


person Anuraj    schedule 18.09.2009    source источник


Ответы (3)


Вам нужно использовать | вместо &.

Это бинарные флаги, и когда вы говорите &, вы эффективно маскируете их все, в результате чего у вас не остается никаких вариантов.

person Lasse V. Karlsen    schedule 18.09.2009
comment
Но я получаю исключение, операция ввода-вывода не будет работать. Скорее всего файл станет слишком длинным или дескриптор не был открыт для поддержки синхронных операций ввода-вывода., если я поставлю | вместо &, когда я вызываю this.fcommandHandler.Close() - person Anuraj; 18.09.2009
comment
@Anuraj: Это не значит | неправильно, это означает, что что-то в вашем использовании неверно. Лассе прав, что вам нужно | вместо &. Исключением является ваша следующая проблема, которую нужно решить. - person Jeff Yates; 18.09.2009
comment
@Jeff Yates: Спасибо, позвольте мне попробовать другие варианты. - person Anuraj; 18.09.2009
comment
Как это сделать в VB.NET? У меня похожая проблема с And результат 0 - person HackSlash; 21.06.2018
comment
Попробуйте вместо этого использовать Or, хотя я не эксперт по VB, поэтому, если вы застряли, вы можете поискать его. - person Lasse V. Karlsen; 21.06.2018

Используйте FileOptions.DeleteOnClose | FILE_FLAG_NO_BUFFERING, & отменяет их.

FILE_FLAG_NO_BUFFERING & FileOptions.DeleteOnClose возвращает FileOptions.None

person Yuriy Faktorovich    schedule 18.09.2009
comment
Пожалуйста, проверьте комментарий к первому ответу. - person Anuraj; 18.09.2009
comment
@Anuraj: я пытаюсь выяснить, что такое File_flag_no_buffering, DeleteOnClose определенно не вызывается, потому что вы делаете и вместо или. - person Yuriy Faktorovich; 18.09.2009
comment
@Yuriy Faktorovich - Параметр файла File_flag_no_buffering - это параметр файла, который помогает избежать кэширования файлов при чтении и записи файлов Windows. Проверьте это stackoverflow.com/questions/122362/ - person Anuraj; 18.09.2009
comment
@Анурадж: Спасибо. Вы можете увидеть | применяется в ответах на эту тему. - person Yuriy Faktorovich; 18.09.2009
comment
@Yuriy Faktorovich: я получаю исключение, операция ввода-вывода не будет работать. Скорее всего файл станет слишком длинным или дескриптор не был открыт для поддержки синхронных операций ввода-вывода., если я поставлю | вместо &, когда я вызываю this.fcommandHandler.Close() - person Anuraj; 18.09.2009

Попробуйте также включить флаг WriteThrough в список, используя | оператор. См. КБ о требованиях для использования FILE_FLAG_NO_BUFFERING. Интересно, что MS не включила этот флаг в перечисление. Есть ли причина, по которой WriteThrough не делает то, что вам нужно в этом сценарии? Вы пытаетесь записать безопасные данные?

person AnthonyWJones    schedule 18.09.2009
comment
@AnthonyWJones: я пробовал это, но все равно получаю эту ошибку. Я пытаюсь добиться такого: мне нужно отправить некоторые команды на USB через устройство File (например, cmd.bin), и оно вернет некоторые ответы в файле (например, res.bin). Но если я использую обычный C# Stream, Windows будет кэшировать ответ, и я всегда буду получать один и тот же ответ, поэтому я должен использовать флаг «Без буферизации». И файлы временные, поэтому я должен удалить их после использования, поэтому я использую флаг «Удалить при закрытии». - person Anuraj; 18.09.2009
comment
В таком случае вопрос, который вам задал Юрий, имеет другой подход к открытию такого файла, я бы попробовал. - person AnthonyWJones; 18.09.2009