如何在C#中锁定文件夹

时间:2010-11-16 19:18:27

标签: c#

我希望使用C#永久锁定我的文件夹。

只有在请求时,应用程序才能访问该锁。关闭应用程序时,不应访问该锁定。此外,当应用程序运行时,无法在应用程序外移动或打开该文件夹。意味着,只能通过我的应用程序访问该文件夹。

4 个答案:

答案 0 :(得分:3)

以下代码将有助于锁定和解锁文件夹。

来源:http://bitsbyta.blogspot.de/2011/01/lock-and-unlock-folder-cnet.html

using System.IO;
using System.Security.AccessControl;

private void btnBrowse_Click(object sender, EventArgs e)
{

   if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
   {
        // Select the folder to lock
        textBox1.Text = folderBrowserDialog1.SelectedPath;
   }

}

private void btnLock_Click(object sender, EventArgs e)
{
  try
     {

      string folderPath = textBox1.Text;
      string adminUserName = Environment.UserName;// getting your adminUserName
      DirectorySecurity ds = Directory.GetAccessControl(folderPath);
      FileSystemAccessRule fsa = new FileSystemAccessRule(adminUserName, FileSystemRights.FullControl, AccessControlType.Deny)    
      ds.AddAccessRule(fsa);
      Directory.SetAccessControl(folderPath, ds);
      MessageBox.Show("Locked");
     }
     catch (Exception ex)
     {
        MessageBox.Show(ex.Message);
     }       
}

private void btnUnLock_Click(object sender, EventArgs e)
{
   try
      {
     string folderPath = textBox1.Text;
     string adminUserName = Environment.UserName;// getting your adminUserName
     DirectorySecurity ds = Directory.GetAccessControl(folderPath);
     FileSystemAccessRule fsa = new FileSystemAccessRule(adminUserName,FileSystemRights.FullControl, AccessControlType.Deny)    
     ds.RemoveAccessRule(fsa);
     Directory.SetAccessControl(folderPath, ds);
     MessageBox.Show("UnLocked");
     }
     catch (Exception ex)
     {
        MessageBox.Show(ex.Message);
     } 
}

答案 1 :(得分:2)

简而言之,只有C#才能得到你想要的东西。程序只能在运行时锁定资源。

您可以做的是设置一个用户,该用户是该文件夹的所有者,并且是唯一可以读取/写入该文件夹的用户。这可以使用Active Directory或普通的Windows用户帐户完成。请记住,您通常也想让管理员进入,所以如果出现问题,您可以修复它而无需成为这个新用户(可能没有其他所需的权限来解决问题)。然后,让你的程序作为该用户进行身份验证(可能通过模拟),它将能够使用该文件夹,但其他人不会。

此文件包含什么内容?如果您要存储敏感数据或不应更改的数据,我会将其放入数据库中。我说这有几个原因;首先,作为一个不同的用户连接到数据库比用于模拟与运行程序的用户不同的Windows用户更容易。文件夹权限的编程管理还需要为您的程序提供管理权限。 DB还允许非常精细的数据访问(直到列级别)。最后,你不太可能最终得到一个错误和现场投诉,你的程序在用户的计算机上创建了一个无法访问,浪费空间的文件夹,即使在卸载程序后也无法删除。

答案 2 :(得分:0)

您可以加密文件,并在应用程序打开时锁定它们,但是您无法阻止其他人删除该文件或恢复到该文件的先前版本。您可以尝试记录哪个文件签名是最新的文件签名,但他们也可以将其恢复为。

您应该指定您的用例。

答案 3 :(得分:0)

您可以通过PInvoking CreateFile and setting the FILE_FLAG_BACKUP_SEMANTICS flag打开一个文件夹。

看看下面的例子:

// Create a directory named DirToLock
const string directoryName = "DirToLock";
if (!Directory.Exists(directoryName))
{
    Directory.CreateDirectory(directoryName);
}

// Open and lock the directory we've just created
var handle = CreateFile(
    directoryName, 
    FileAccess.Read, 
    FileShare.None, // Causes all requests to open this file to fail until the file is closed.
    IntPtr.Zero, 
    FileMode.Open,
    (FileAttributes) BackupSemantics, // BackupSemantics = 0x02000000
    IntPtr.Zero
);

至于

  

关闭应用程序后,该锁应不可访问

上面的代码将使目录在过程运行时保持锁定状态。要在程序仍在运行时解锁目录,您需要关闭其句柄(即通过PInvoking CloseHandle):

CloseHandle(handle);