如果原始文件被锁定,是否可以从挂载点读取?

时间:2015-02-03 16:12:08

标签: 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 | FILE_FLAG_OPEN_REPARSE_POINT,
         NULL);

我遇到32 - The process cannot access the file because it is being used by another process.错误。 我使用以下代码来确定路径是否是挂载点

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.g. C:/mount/G),但是当我用它测试一些嵌套路径(e.g. C:/mount/G/test)时,它表示此路径不是安装文件夹。 那么是否可以从mount文件夹中读取文件并避免另一个进程正在使用另一个文件的问题?因为我一直在玩这个问题,似乎只有根文件夹被视为一个挂载点,并且所有嵌套的项目都只能从原始位置读取...

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

2 个答案:

答案 0 :(得分:1)

您误解了这个概念:挂载点

  

...似乎只有根文件夹被视为挂载点,所有嵌套的项目都可以......

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

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

此处的装载文件夹为C:/mount/G

关于您的其他问题。

  

那么是否可以从mount文件夹中读取文件并避免另一个进程正在使用另一个文件的问题?

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

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

答案 1 :(得分:0)

只有当你想打开实际的重新分析点(FILE_FLAG_OPEN_REPARSE_POINT;例如实际告诉操作系统正在进行重新分析的数据时,才需要

C:\mount\G。例如,您将使用该标志来确定C:\mount\G实际指向的位置。如果您不想这样做并且您选择的路径不是重新分析点那么您的里程可能会有所不同。

如果另一个进程正在读取文件会发生什么......那就完全取决于其他进程提供的共享标志,当然还有你自己的共享标志。如果其他进程未提供FILE_SHARE_READ权限,则通常不会在其他进程不允许的情况下读取该文件。