Я реализую класс на С#, который должен отслеживать каталог, обрабатывать файлы по мере их удаления, а затем удалять (или перемещать) обработанный файл, как только обработка завершена. Поскольку для этого кода может быть несколько потоков, первая из которых берет файл, блокирует его исключительно, поэтому никакие другие потоки не будут читать один и тот же файл , и никакой внешний процесс или пользователь не могут каким-либо образом получить доступ, Я хотел бы сохранить блокировку до тех пор, пока файл не будет удален/перемещен, поэтому нет риска для другого потока/процесса/пользователя, обращающегося к нему.
До сих пор я пробовал 2 варианта реализации, но ни один из них не работает так, как я хочу.
Вариант 1
FileStream fs = file.Open(FileMode.Open, FileAccess.Read, FileShare.Delete);
//Read and process
File.Delete(file.FullName); //Or File.Move, based on a flag
fs.Close();
Вариант 2
FileStream fs = file.Open(FileMode.Open, FileAccess.Read, FileShare.None);
//Read and process
fs.Close();
File.Delete(file.FullName); //Or File.Move, based on a flag
Проблема с Вариантом 1 заключается в том, что другие процессы могут получить доступ к файлу (они могут удалять, перемещать, переименовывать), пока он должен быть полностью заблокирован.
Проблема с Вариантом 2 заключается в том, что файл разблокирован перед удалением, поэтому другие процессы/потоки могут блокировать файл до удаления, поэтому удаление будет неудачным.
Я искал какой-то API, который может выполнить удаление с помощью дескриптора файла. У меня уже есть эксклюзивный доступ.
Изменить
Контролируемый каталог находится в паб-ресурсе, поэтому к нему могут обращаться другие пользователи и процессы. Проблема заключается не в управлении блокировками в моем собственном процессе. Проблема, которую я пытаюсь решить, заключается в том, как заблокировать файл, а затем переместить/удалить его, не отпуская блокировку