查找符号 link 指向 (Windows) 的位置
Finding where a symbolic link points to (Windows)
我使用 FindFirstFile() 和联合函数来浏览 C:\example\dir
的内容。通过检查是否 d.dwAttributes & FILE_ATTRIBUTE_REPARSE_POINT != 0
,我知道读取的文件可以是符号 link、连接等。但是,我还没有找到一种方法来跟踪 link 并查看它指向的位置。这可能吗?
要找到符号 link 的目标,您必须打开符号 link。对象管理器取消引用 link 和 returns 目标位置的句柄。在该句柄上调用 GetFinalPathNameByHandle returns 目标的路径名。
下面实现returns目标位置,给定一个符号link:
std::wstring GetLinkTarget( const std::wstring& a_Link ) {
// Define smart pointer type for automatic HANDLE cleanup.
typedef std::unique_ptr<std::remove_pointer<HANDLE>::type,
decltype( &::CloseHandle )> FileHandle;
// Open file for querying only (no read/write access).
FileHandle h( ::CreateFileW( a_Link.c_str(), 0,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr ),
&::CloseHandle );
if ( h.get() == INVALID_HANDLE_VALUE ) {
h.release();
throw std::runtime_error( "CreateFileW() failed." );
}
const size_t requiredSize = ::GetFinalPathNameByHandleW( h.get(), nullptr, 0,
FILE_NAME_NORMALIZED );
if ( requiredSize == 0 ) {
throw std::runtime_error( "GetFinalPathNameByHandleW() failed." );
}
std::vector<wchar_t> buffer( requiredSize );
::GetFinalPathNameByHandleW( h.get(), buffer.data(),
static_cast<DWORD>( buffer.size() ),
FILE_NAME_NORMALIZED );
return std::wstring( buffer.begin(), buffer.end() - 1 );
}
注意:有关基于std::unique_ptr see std::unique_ptr, deleters and the Win32 API的RAII包装器的详细信息。
我使用 FindFirstFile() 和联合函数来浏览 C:\example\dir
的内容。通过检查是否 d.dwAttributes & FILE_ATTRIBUTE_REPARSE_POINT != 0
,我知道读取的文件可以是符号 link、连接等。但是,我还没有找到一种方法来跟踪 link 并查看它指向的位置。这可能吗?
要找到符号 link 的目标,您必须打开符号 link。对象管理器取消引用 link 和 returns 目标位置的句柄。在该句柄上调用 GetFinalPathNameByHandle returns 目标的路径名。
下面实现returns目标位置,给定一个符号link:
std::wstring GetLinkTarget( const std::wstring& a_Link ) {
// Define smart pointer type for automatic HANDLE cleanup.
typedef std::unique_ptr<std::remove_pointer<HANDLE>::type,
decltype( &::CloseHandle )> FileHandle;
// Open file for querying only (no read/write access).
FileHandle h( ::CreateFileW( a_Link.c_str(), 0,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr ),
&::CloseHandle );
if ( h.get() == INVALID_HANDLE_VALUE ) {
h.release();
throw std::runtime_error( "CreateFileW() failed." );
}
const size_t requiredSize = ::GetFinalPathNameByHandleW( h.get(), nullptr, 0,
FILE_NAME_NORMALIZED );
if ( requiredSize == 0 ) {
throw std::runtime_error( "GetFinalPathNameByHandleW() failed." );
}
std::vector<wchar_t> buffer( requiredSize );
::GetFinalPathNameByHandleW( h.get(), buffer.data(),
static_cast<DWORD>( buffer.size() ),
FILE_NAME_NORMALIZED );
return std::wstring( buffer.begin(), buffer.end() - 1 );
}
注意:有关基于std::unique_ptr see std::unique_ptr, deleters and the Win32 API的RAII包装器的详细信息。