C# – 在处理时阻止更改文件夹

我有一个单线程程序来处理源目录中的文件夹和文件。 有没有办法阻止我的程序正在处理它的源文件目录中的文件夹被其他进程修改? 我正在考虑在文件夹本身上放置某种独占锁的方法,所以只有我程序的进程才能使用它。

注意:

我不想阻止根源目录本身,只是在该目录的顶层中的任何文件夹,我可能在任何特定时刻处理。 我仍然希望能够允许外部进程将文件夹添加到源目录,而我正在处理其他文件夹。

更新:

@Yuri – 是的,这是一个Windows程序,准确的Windows服务应用程序。

使这既具有挑战性又必要的部分原因是我需要在源目录中的单独目标目录中重新创建我正在处理的任何文件夹的结构。 因此,当我的程序正在使用文件夹时,我无法修改文件夹和文件。

锁定文件夹的方法:

1.只读它。 (包括因为人们总是尝试这个)
Con – 这实际上不起作用。 在文件夹上,只读标志用于其他目的。

2.只读取所有内容。
Con – 不会阻止某些类型的操作(例如,创建新项目)。

3.使用ACL
Con – 不会阻止管理员弄乱文件夹。 需要某些类型的权限。

4.使用特殊创建的用户启用ACL并启用文件夹加密。
Con – 这真是令人恐惧。 如果出现任何问题,您的数据可能会丢失。

5.重命名/移动文件夹
Con – 可以被用户愚蠢所绕过。

6. (编辑) gjvdkamp的回答: 锁定单个文件
Con – 与#2一样,这仍然允许文件夹中创建新文件。 也就是说,这是The Right Way™

编辑不要我们这个黑客,不起作用: http : //itknowledgeexchange.techtarget.com/itanswers/folder-lock/

否则我会遍历foder中的所有文件,创建一个list ,然后在每个文件上调用Lock。 这将使您能够更精细地控制要锁定的文件。

GJ

编辑:尝试以下这些方面:

 var locks = new List(); var di = new DirectoryInfo(@"C:\Test"); foreach (var file in di.GetFiles()) { var fs = new FileStream(file.FullName, FileMode.Open); fs.Lock(0, 0); locks.Add(fs); } 

你为什么不拿一个新的文件夹副本,对那个文件夹进行处理,然后在必要时更换旧文件夹?

我想这可能对你有帮助http://www.codeproject.com/KB/files/Unique_Folder_Protection.aspx

本文基本上做的是将文件夹的扩展名更改为以下之一

“。{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}”“。{21EC2020-3AEA-1069-A2DD-08002B30309D}”“。{2559a1f4-21d7-11d4-bdaf-00c04f60b9f0}”“。{645FF040-5081-101B -9F08-00AA002F954E}“”。{2559a1f1-21d7-11d4-bdaf-00c04f60b9f0}“”。{7007ACC7-3202-11D1-AAD2-00805FC1270E}“

并将密码存储在文件夹中

希望这可以帮助

亚历克斯