#winapi
#winapi
Вопрос:
У меня есть следующий код, чтобы получить размер сектора диска локального или подключенного диска:
#include <Windows.h>
#include <stdexcept>
#include <sstream>
#include <string>
#include "xhandle.h"
#include "DiskSectorSize.h"
DiskSectorSize getDiskSectorSize( char const *filename )
{
using namespace std;
DWORD dwFfnLength;
if( (dwFfnLength = GetFullPathNameA( filename, 0, nullptr, nullptr )) == 0 )
throw system_error( error_code( (int)GetLastError(), system_category() ),
(stringstream() << "can't get full path for path "" << filename << """).str().c_str() );
string fullFileName( (size_t)dwFfnLength, 0 );
if( GetFullPathNameA( filename, dwFfnLength, amp;fullFileName[0], nullptr ) == 0 )
throw system_error( error_code( (int)GetLastError(), system_category() ),
(stringstream() << "can't get full path for path" << filename).str().c_str() );
if( dwFfnLength < 2 || toupper( fullFileName[0] ) < 'A' || toupper( fullFileName[0] ) > 'Z' || fullFileName[1] != ':' )
throw exception( "no drive letter in absolute path" );
string logicalDrive = "\\.\ ";
logicalDrive.replace( logicalDrive.begin() 4, logicalDrive.begin() 6, fullFileName.begin(), fullFileName.begin() 2 );
XHANDLE xhDevice( CreateFileA( logicalDrive.c_str(), 0, 0, NULL, OPEN_EXISTING, 0, NULL ), true,
"can't create device handle for disk" );
DWORD dwOutSize;
STORAGE_PROPERTY_QUERY spq;
memset( amp;spq, 0, sizeof spq);
spq.PropertyId = StorageAccessAlignmentProperty;
spq.QueryType = PropertyStandardQuery;
STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR saad;
memset( amp;saad, 0, sizeof saad );
if( !DeviceIoControl( xhDevice, IOCTL_STORAGE_QUERY_PROPERTY, amp;spq, sizeof spq, amp;saad, sizeof saad, amp;dwOutSize, NULL ) ||
dwOutSize != sizeof saad )
throw system_error( error_code( (int)GetLastError(), system_category() ),
(stringstream() << "can't detemine disk sector size for device" << fullFileName).str().c_str() );
DiskSectorSize dss;
dss.dwPhysical = saad.BytesPerPhysicalSector;
dss.dwLogical = saad.BytesPerLogicalSector;
return dss;
}
Но я не могу получить размер сектора диска UNC-файла с помощью at. Когда я писал приведенный выше код, я также нашел способ сделать это. Но сегодня я не могу вспомнить это точно.
Комментарии:
1. Вы можете попытаться получить
Win32_MappedLogicalDisk
для подключенного диска и получить все доступные элементы, содержащиеся в классе.2. Итак, реальный вопрос заключается в том, как найти том с учетом UNC-пути?
3. Я хочу получить размер сектора диска без подключенного логического диска, просто используя UNC-path @DrakeWu-MSFT / IInspectable.
4. Я полагаю, вы могли бы попробовать GetVolumePathNameW , за которым следует GetVolumeNameForVolumeMountPointW , чтобы получить путь GUID тома.