【问题标题】:How to lock a directory and prevent it from being deleted?如何锁定目录并防止其被删除?
【发布时间】:2012-09-28 21:16:15
【问题描述】:

我需要检查一个目录是否存在,如果不存在则创建它并在我的应用程序启动时锁定它。所以只要应用程序运行,没有人可以删除目录。

我想我可以在其中保存一个哑文件并保持打开状态,这样它就不能被删除,但我不想如果可能的话。我怎样才能做到这一点?


现在,每当我需要在其中写入文件时,我都会这样做:

if (!Directory.Exists(path))
    Directory.CreateDirectory(path);

即使在这个例子中,仍然可以删除Directory.CreateDirectoryFile.Create 调用之间的目录。

【问题讨论】:

  • 旁注:使用Directory.CreateDirectory时不必检查Directory.Exists:如果目录已经存在,此方法不会创建新目录,而是返回一个DirectoryInfo现有目录的对象。
  • 您基本上是在问“我怎样才能确保接到服务电话的是另一个人?”创建文件是正确的方法。当然,另一个人会通过删除该文件来反击。您可以将 Environment.CurrentDirectory 设置为该目录,这使得它更难。他会通过杀死你的程序来反击。

标签: c# .net file directory


【解决方案1】:

在目录中创建一个虚拟临时文件,并在程序的生命周期内保持打开状态。这样,任何试图删除目录的人都会收到“正在使用的目录”错误消息并且无法删除它。

【讨论】:

    【解决方案2】:

    我建议您在某处创建一个临时文件夹并在那里进行所有处理,一旦完成创建并将您的文件移动到目标文件夹。每件事都成功完成后,您可以删除临时文件夹。

    【讨论】:

      【解决方案3】:

      在目录上使用 CreateFile WINAPI 函数。未经测试,但我认为它会工作。

      [DllImport("kernel32.dll", SetLastError = true)]
              private static extern SafeFileHandle CreateFile(
                  string lpFileName,
                  FileAccess dwDesiredAccess,
                  FileShare dwShareMode,
                  IntPtr lpSecurityAttributes,
                  FileMode dwCreationDisposition,
                  int dwFlagsAndAttributes,
                  IntPtr hTemplateFile);
      
      const int FILE_FLAG_BACKUP_SEMANTICS = 0x02000000;
      var dirlock = CreateFile("C:\\mydir", FileAccess.Read, FileShare.None, IntPtr.Zero, FileMode.Open,
                                           FILE_FLAG_BACKUP_SEMANTICS, IntPtr.Zero);
      

      【讨论】:

      • 这会阻止我在资源管理器中打开文件夹,但很有趣:它仍然可以被删除。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多