【问题标题】:C# - Blocking a folder from being changed while processingC# - 在处理时阻止文件夹被更改
【发布时间】:2011-06-09 05:50:11
【问题描述】:

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

注意:

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

更新:

@Yuri - 是的,这是一个 Windows 程序,确切地说是一个 Windows 服务应用程序。

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

【问题讨论】:

  • 我想知道新的 I/O 事务方法是否有帮助。
  • 您的程序可以不锁定文件夹,而是再次扫描内容,以确保自您开始以来没有任何外部更改(检查文件名和日期)

标签: c# .net


【解决方案1】:

锁定文件夹的方法:

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

2.将所有内容标记为只读。
缺点 - 不会阻止某些类型的操作(例如,创建新项目)。

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

4.使用 ACL 和特殊创建的用户并启用文件夹加密。
骗局——这真是太可怕了。如果出现任何问题,您的数据可能会丢失。

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

6.(编辑) gjvdkamp 的回答:Lock Individual files
缺点 - 与 #2 一样,这仍然允许在文件夹创建新文件。也就是说,这是正确的方式™

【讨论】:

  • 嗨,Brian,ACL 可能会起作用。只要我知道没有人或其他任何人都不能弄乱它,就我而言,只留下能够弄乱文件夹及其内容的管理员可能不是什么大问题。
  • @kingrichard:很公平。就个人而言,我以管理员身份运行我的 Dev IDE,因为我的一些项目以管理员身份运行,所以这对我根本不起作用。
  • @gjvdkamp:嗯,我注意到我的答案比你的得到更多的投票/关注,可能是因为你在我发布答案大约 2 小时后发布了代码。解决问题的最佳方法(一般来说最好的方法;它可能不是 OP 的最佳方法)不是最佳答案。
【解决方案2】:

edit 不要我们这个 hack,不起作用: http://itknowledgeexchange.techtarget.com/itanswers/folder-lock/

否则我会遍历 foder 中的所有文件,创建一个list<FileStream>,然后在每个文件上调用 Lock。这将使您对要锁定的文件进行更细粒度的控制。

GJ

编辑:尝试以下方法:

var locks = new List<FileStream>();
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);
}

【讨论】:

  • 我认为黑客只会阻止 Explorer 访问该文件夹。但我建议锁定每个单独的文件。
  • 还没有尝试过这种破解,但我喜欢你的第二个想法,因为我已经从我正在处理的文件夹中收集文件。在这种情况下,我将如何为列表中的每个文件添加锁?
  • +1 :这比我想的使用 readonly 干净得多,即使程序崩溃,锁也会自然释放,这与我的解决方案不同。
  • @Brian - 谢谢Brian,我目前正忙于其他任务,但我会尝试这种方法。太糟糕了,这样的锁定机制对于目录不存在,这将解决我的问题。
【解决方案3】:

您为什么不获取该文件夹的新副本,处理该文件夹,然后在必要时替换旧的?

【讨论】:

  • 因为如果另一个服务在该文件夹上工作,这些操作将被丢弃。
  • 没错,这是一种妥协。但是还有什么其他选择:狡猾的黑客和设置只读。
  • 避免此问题的类似折衷办法是重命名文件夹,但这也意味着只想读取文件夹的程序也不能这样做。
【解决方案4】:

我想这可能会对你有所帮助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}"

并将密码保存在文件夹中

希望对你有帮助

亚历克斯

【讨论】:

  • 这只会阻止通过 Explorer shell 进行访问。仍然可以通过命令行访问该文件夹,可能还有其他涉及直接路径的方法(例如其他程序)。当然,它也会重命名文件夹,如果某些东西期望文件夹存在但不会阻止任何内容实际写入那里,这可能会导致读取错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多