如何检测是否正在使用MemoryMappedFile(C#.NET Core)

问题描述 投票:0回答:1

我的情况类似于this previous question,但与之前的答案相差无几。

我正在生成PDF文件,然后告诉Windows使用用户安装的任何PDF应用程序打开该文件:

new Process
{
    StartInfo = new ProcessStartInfo(pdfFileName)
    {
        UseShellExecute = true
    }
}.Start();

这是针对客户的,他们已经指定PDF文件始终具有相同的名称。问题是,如果他们用于查看PDF文件的应用程序是Microsoft Edge(其他应用程序也可能如此),如果我尝试在用户关闭Edge之前生成第二个PDF,则会出现异常“无法在打开用户映射部分的文件上执行请求的操作。“

我想创建一个有用的用户界面,告诉用户在关闭第一个报告之前他们不能生成第二个报告,我认为我需要进行非破坏性的操作,因为我想使用此信息来禁用在用户按下文件之前单击“生成”按钮,因此,例如,我可能会尝试删除文件以检查文件是否正在使用中,但是我不想在用户尝试生成新文件之前删除文件。 >

我现在有此代码:

public static bool CanWriteToFile(string pdfFileName)
{
    if (!File.Exists(pdfFileName))
        return true;

    try
    {
        using (Stream stream = new FileStream(pdfFileName, FileMode.Open, FileAccess.ReadWrite))
        {
        }
    }
    catch (Exception ex)
    {
        return false;
    }

    try
    {
        using (MemoryMappedFile map = MemoryMappedFile.CreateFromFile(pdfFileName, FileMode.Open, null, 0, MemoryMappedFileAccess.ReadWrite))
        {
            using (MemoryMappedViewStream stream = map.CreateViewStream())
            {
                stream.Position = 0;
                int firstByte = stream.ReadByte();
                if (firstByte != -1)
                {
                    stream.Position = 0;
                    stream.WriteByte((byte)firstByte);
                    stream.Flush();
                }
            }
        }
    }
    catch(Exception ex)
    {
        return false;
    }

    return true;
}

即使在Edge中打开文件,此代码也会返回'true'。似乎无法请求“专有”内存映射文件。

实际上有没有办法告诉另一个进程在特定的物理文件上有一个打开的内存映射文件?

我的处境类似于上一个问题,但与之前的答案相差太大,无法正常工作。我正在生成PDF文件,然后告诉Windows使用任何PDF文件打开该文件...

c# .net-core memory-mapped-files
1个回答
0
投票

我使用它来检查文件是否正在使用中:

© www.soinside.com 2019 - 2024. All rights reserved.