【发布时间】:2013-03-15 18:23:28
【问题描述】:
我在 C# 中实现了一个类,它应该监视一个目录,在文件被删除时对其进行处理,然后在处理完成后立即删除(或移动)已处理的文件。由于可以有多个线程运行此代码,第一个获取文件的线程将其独占锁定,因此没有其他线程将读取同一文件并且没有外部进程或用户可以以任何方式访问 .我想保持锁定直到文件被删除/移动,所以没有另一个线程/进程/用户访问它的风险。
到目前为止,我尝试了 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。
编辑
被监控的目录位于 pub 共享中,因此其他用户和进程可以访问它。 问题不是在我自己的进程中管理锁。我要解决的问题是如何以独占方式锁定文件,然后在不释放锁定的情况下移动/删除它
【问题讨论】:
-
能否在处理之前将其重命名为其他线程无法获取的名称?
-
文件名可以是任何东西,因此重命名将无济于事。即使文件名很重要,我也想防止任何其他有权访问该文件夹的进程或用户在它被锁定时触摸它。
标签: c# .net winapi file-locking