如果原始文件被锁定,是否可以从挂载点读取?
Is it possible to read from mount point if original file is locked?
我试图从挂载点读取文件,但问题是原始文件被其他进程锁定,所以当我尝试通过
获取文件句柄时
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
) 时它说这个路径不是挂载文件夹。
那么是否可以从安装文件夹中读取文件并避免另一个进程正在使用另一个文件的问题?因为我一直在解决这个问题,似乎只有根文件夹被视为挂载点,所有嵌套项目只能从原始位置读取...
当我通过 ProcessExplorer 通过挂载点检查此文件时,它说没有人在使用它。
FILE_FLAG_OPEN_REPARSE_POINT
仅在您想要打开实际重分析点时才需要(C:\mount\G
;例如,实际告诉 OS 正在发生重分析的数据)。例如,您可以使用该标志来确定 C:\mount\G
实际指向的位置。如果您不想这样做并且您选择的路径不是重新分析点,那么您的里程可能会有所不同。
至于如果另一个进程正在读取文件会发生什么……这完全取决于其他进程提供的任何共享标志,当然还有您自己的共享标志。如果其他进程没有提供 FILE_SHARE_READ
权限,那么通常您不能读取文件,而其他进程不允许您。
你误解了概念:挂载点。
... it seems like only the root folder is treated as a mount point and all nested items could ...
根文件夹是挂载点,所有其他嵌套文件和文件夹都是相对于挂载点的。
如果根安装点是文件夹 C:/mount/G
,则文件夹 C:/mount/G/test
在内部或相对于安装点,因此 不是安装文件夹 。
这里的挂载文件夹是C:/mount/G
.
关于你的其他问题。
So is it possible to read a file from the mount folder and avoid problem with another file is being used by another process?
我不这么认为。挂载目录树的事实不会在挂载的目录中复制文件。因此,如果一个文件在 "original" 目录中被访问,它也会在挂载的树中。
您猜对了:...所有嵌套项目只能从原始位置读取...
我试图从挂载点读取文件,但问题是原始文件被其他进程锁定,所以当我尝试通过
获取文件句柄时 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
) 时它说这个路径不是挂载文件夹。
那么是否可以从安装文件夹中读取文件并避免另一个进程正在使用另一个文件的问题?因为我一直在解决这个问题,似乎只有根文件夹被视为挂载点,所有嵌套项目只能从原始位置读取...
当我通过 ProcessExplorer 通过挂载点检查此文件时,它说没有人在使用它。
FILE_FLAG_OPEN_REPARSE_POINT
仅在您想要打开实际重分析点时才需要(C:\mount\G
;例如,实际告诉 OS 正在发生重分析的数据)。例如,您可以使用该标志来确定 C:\mount\G
实际指向的位置。如果您不想这样做并且您选择的路径不是重新分析点,那么您的里程可能会有所不同。
至于如果另一个进程正在读取文件会发生什么……这完全取决于其他进程提供的任何共享标志,当然还有您自己的共享标志。如果其他进程没有提供 FILE_SHARE_READ
权限,那么通常您不能读取文件,而其他进程不允许您。
你误解了概念:挂载点。
... it seems like only the root folder is treated as a mount point and all nested items could ...
根文件夹是挂载点,所有其他嵌套文件和文件夹都是相对于挂载点的。
如果根安装点是文件夹 C:/mount/G
,则文件夹 C:/mount/G/test
在内部或相对于安装点,因此 不是安装文件夹 。
这里的挂载文件夹是C:/mount/G
.
关于你的其他问题。
So is it possible to read a file from the mount folder and avoid problem with another file is being used by another process?
我不这么认为。挂载目录树的事实不会在挂载的目录中复制文件。因此,如果一个文件在 "original" 目录中被访问,它也会在挂载的树中。
您猜对了:...所有嵌套项目只能从原始位置读取...