C++ 如果原始文件被锁定,是否可以从装入点读取?

C++ 如果原始文件被锁定,是否可以从装入点读取?,c++,winapi,C++,Winapi,我试图从挂载点读取文件,但问题是原始文件被其他进程锁定,所以当我试图通过 hFile = CreateFile (szPath, GENERIC_READ | ACCESS_SYSTEM_SECURITY | READ_CONTROL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS

我试图从挂载点读取文件,但问题是原始文件被其他进程锁定,所以当我试图通过

  hFile = CreateFile (szPath,
         GENERIC_READ | ACCESS_SYSTEM_SECURITY | READ_CONTROL,
         FILE_SHARE_READ | FILE_SHARE_WRITE,
         NULL,
         OPEN_EXISTING,
         FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
         NULL);
我得到了
32-进程无法访问该文件,因为它正被另一个进程使用。
错误。 我使用以下代码来确定路径是否为装入点

BOOL bResult = FALSE;
dwAttribut = GetFileAttributes(pwszPath);

if ((FILE_ATTRIBUTE_DIRECTORY & dwAttribut) &&
        (FILE_ATTRIBUTE_REPARSE_POINT & dwAttribut))
{
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind = INVALID_HANDLE_VALUE;

    memset(&FindFileData, 0, sizeof(FindFileData));
    hFind = FindFirstFileW(pwszPath, &FindFileData);
    if (hFind != INVALID_HANDLE_VALUE)
    {
         if (FindFileData.dwReserved0 & IO_REPARSE_TAG_MOUNT_POINT)
         {
             bResult =  TRUE;
         }
    }
}
对于根装入点文件夹(
e.C:/mount/g
),它可以正常工作,但当我用它测试一些嵌套路径(
e.C:/mount/g/test
)时,它表示该路径不是装入文件夹。 那么,是否可以从mount文件夹中读取一个文件,以避免另一个进程正在使用另一个文件时出现问题?因为我一直在解决这个问题,似乎只有根文件夹被视为挂载点,所有嵌套项只能从原始位置读取


当我通过ProcessExplorer通过装入点检查此文件时,它表示没有人在使用它。

file\u FLAG\u OPEN\u repasse\u point
仅当您要打开实际的重新分析点时才需要(
C:\mount\G
;例如,实际告诉操作系统正在进行重新分析的数据)。例如,您可以使用该标志确定
C:\mount\G
实际指向的位置。如果您不想这样做,并且您选择的路径不是重新分析点,则您的里程数可能会有所不同


至于如果另一个进程正在读取文件会发生什么情况。。。这取决于其他进程提供的共享标志,当然也取决于您自己的共享标志。如果另一个进程没有提供
文件\u共享\u读取
权限,则通常不允许您读取文件,而另一个进程不允许您读取。

您误解了这个概念:装入点

。。。似乎只有根文件夹被视为装入点,所有嵌套项都可以

根文件夹是装载点,所有其他嵌套文件和文件夹都是相对于装载点的

如果根装入点是文件夹
C:/mount/G
,则文件夹
C:/mount/G/test
在内部或相对于装入点,因此不是装入文件夹

这里的挂载文件夹是
C:/mount/G

关于你的另一个问题。

那么,是否可以从mount文件夹中读取一个文件,以避免另一个进程正在使用另一个文件时出现问题

我不这么认为。装载目录树的事实不会在装载的目录中复制文件。因此,如果文件在“原始”目录中被访问,它也将在挂载树中


您猜对了:…所有嵌套项只能从原始位置读取…

仅仅因为
G
是重分析点并不意味着它下面的所有内容都是重分析点。如果您想打开重分析点下的文件,只需按正常方式打开即可。重分析点的全部意义在于它们由文件系统透明地处理。装入点与文件共享无关。你不能以这种方式绕过共享限制。(但是,您可以使用VSS创建卷影副本并从中读取。)您指的是像\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy一样的VSS吗?对于Linux,它是否也适用于Linux?