使用使用c#

时间:2019-02-07 06:54:24

标签: c# windows windows-services .net-4.6

我知道类似的问题已经问过很多次了,但是没有任何一项与我的要求相符。如果匹配,请随时将我引向正确的答案。

我有一个用c#,.net framework 4.6开发的Windows服务。
Windows服务每隔1个小时就会从其他服务接收一次任务(此问题无关紧要)。它实际上处理接收到的任务。执行每个任务大约需要10-15分钟才能完成。 在执行任务期间,它将在服务器的一个文件夹中生成多个文件。
在App.config中,我保存了folderpath。举例来说,我的appsetting的值为“ C:\ Test”。
每个任务都有一个taskid,例如说Task1。因此,我们创建了一个文件夹,例如“ C:\ Test \ Task1”。所有文件都在这里生成。并且一旦执行完成,该文件夹就被删除。

现在,我的要求是从接收任务到完成执行为止,我必须锁定生成这些文件的文件夹。
完成执行后,我需要立即解锁该文件夹。通过锁定,我的意思是,没有人应该能够打开该文件夹。

我知道文件可以被锁定。但是如何在这里锁定文件夹。任何人都可以在这里帮助我或为我提供正确的文章。 会很有帮助的。非常感谢!

2 个答案:

答案 0 :(得分:0)

这是可能的,我认为有多种方法可以做到这一点。

首先,您必须创建一个临时if (coord->isValid()) { m_path.append(QVariant::fromValue(coord)); } 。为什么?仅允许一个用户访问此指定目录,并删除对其他帐户的访问。您可以使用 System.Security.AccessControl 名称空间中提供的DirectorySecurity类来完成此操作。

上面还附有一个示例。

  

PS:msdn上有类似的帖子

答案 1 :(得分:0)

锁定磁盘上的文件是很难做到的。您可能希望考虑的一种替代方法是改为使用Memory-Mapped files,特别是非持久性内存映射文件

  

非持久性文件是不与磁盘上的文件关联的内存映射文件。当最后一个进程处理完文件后,数据将丢失,并且垃圾回收将回收该文件。这些文件适用于为进程间通信(IPC)创建共享内存。

这是一个非常简短的示例,该示例显示了如何创建一个非持久性的内存映射文件,对其进行写入和读取:

static void Main(string[] args)
{
    var file = CreateFile("Mary had a little lamb, its fleece was white as snow...");

    var contentFromFile = ReadFile(file);

    Console.WriteLine(contentFromFile);
}

private static MemoryMappedFile CreateFile(string content)
{
    var file = MemoryMappedFile.CreateNew("temp.csv", 1048576);

    using (var stream = file.CreateViewStream())
    {
        using (var writer = new StreamWriter(stream))
        {
            writer.WriteLine(content);
        }
    }

    return file;
}

private static string ReadFile(MemoryMappedFile file)
{
    using (var stream = file.CreateViewStream())
    {
        using (var reader = new StreamReader(stream))
        {
            var contentReadFromStream = reader.ReadLine();
            return contentReadFromStream;
        }
    }
}