Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中锁定文件夹#_C# - Fatal编程技术网

C# 如何在C中锁定文件夹#

C# 如何在C中锁定文件夹#,c#,C#,我想用C#永久锁定我的文件夹 应用程序只应在请求时访问该锁。当应用程序关闭时,该锁不应可访问。此外,当应用程序正在运行时,无法在应用程序外部移动或打开该文件夹。意味着,只有通过我的应用程序才能访问该文件夹。你可以加密你的文件,并在应用程序打开时锁定它们,但你不能阻止其他人删除该文件或恢复到该文件的以前版本。您可以尝试保留最新文件签名的记录,但他们也可以恢复该记录 您应该指定您的用例。简言之,单靠C#无法得到您想要的。程序只能在资源运行时锁定资源 您可以做的是设置一个用户,该用户是该文件夹的所有者

我想用C#永久锁定我的文件夹


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

你可以加密你的文件,并在应用程序打开时锁定它们,但你不能阻止其他人删除该文件或恢复到该文件的以前版本。您可以尝试保留最新文件签名的记录,但他们也可以恢复该记录

您应该指定您的用例。

简言之,单靠C#无法得到您想要的。程序只能在资源运行时锁定资源

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


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

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

资料来源:


您可以通过打开文件文件夹

请看下面的示例:

// 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):


“锁”是什么意思?谁应该被关在外面?应该“锁定”文件夹上的哪些操作?确实要使用文件系统吗?也许本地数据库是更好的选择?这段代码在目录上设置NTFS ACL,它与文件系统资源锁不同。
// 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
);
CloseHandle(handle);