Windows C++ API BackupRead зависает (?) при попытке получить все потоки файлаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Windows C++ API BackupRead зависает (?) при попытке получить все потоки файла

Сообщение Anonymous »

Я пытаюсь исследовать проблему, из-за которой Windows C++ API BackupRead, используемый в нашем программном обеспечении, зависает для нескольких файлов.
Я подозреваю, что причиной являются большие потоки файлов.
Я написал небольшой инструмент для имитации вызовов BackupRead, вызываемых в цикле для чтения всех потоков файла и их вывода.
Я вижу, что инструмент также зависает в вызовах BackupRead для файлов Microsoft Excel (.xls и .xlsx).
Я хотел знать, есть ли в этих файлах Excel что-то особенное, вызывающее такое поведение.

Вывод инструмента (зависает после чтения BACKUP_DATA):

Код: Выделить всё

Getting streams for file: file.xls
----------------------------
Header BackupRead returned: 1, BytesRead: 20
StreamId: BACKUP_SECURITY_DATA, Size: 260, NameSize: 0
TotalStreamSize: 260, RemainingBufferSize: 1048556, OffsetInBuffer: 20
Data BackupRead returned: 1, BytesRead: 260, ToRead: 260
Completed reading stream: BACKUP_SECURITY_DATA and resetting buffer for next stream
----------------------------
Header BackupRead returned: 1, BytesRead: 20
StreamId: BACKUP_DATA, Size: 43520, NameSize: 0
TotalStreamSize: 43520, RemainingBufferSize: 1048556, OffsetInBuffer: 20
Data BackupRead returned: 1, BytesRead: 43520, ToRead: 43520
Completed reading stream: BACKUP_DATA and resetting buffer for next stream
Ожидаемый результат инструмента:

Код: Выделить всё

Getting streams for file: file.pdf
----------------------------
Header BackupRead returned: 1, BytesRead: 20
StreamId: BACKUP_SECURITY_DATA, Size: 200, NameSize: 0
TotalStreamSize: 200, RemainingBufferSize: 1048556, OffsetInBuffer: 20
Data BackupRead returned: 1, BytesRead: 200, ToRead: 200
Completed reading stream: BACKUP_SECURITY_DATA and resetting buffer for next stream
----------------------------
Header BackupRead returned: 1, BytesRead: 20
StreamId: BACKUP_DATA, Size: 229272, NameSize: 0
TotalStreamSize: 229272, RemainingBufferSize: 1048556, OffsetInBuffer: 20
Data BackupRead returned: 1, BytesRead: 229272, ToRead: 229272
Completed reading stream: BACKUP_DATA and resetting buffer for next stream
----------------------------
Header BackupRead returned: 1, BytesRead: 20
StreamId: BACKUP_OBJECT_ID, Size: 64, NameSize: 0
TotalStreamSize: 64, RemainingBufferSize: 1048556, OffsetInBuffer: 20
Data BackupRead returned: 1, BytesRead: 64, ToRead: 64
Completed reading stream: BACKUP_OBJECT_ID and resetting buffer for next stream
----------------------------
Header BackupRead returned: 1, BytesRead: 0
No more streams to read
Код инструмента:

Код: Выделить всё

int main()
{
wstring wstrFile = "";
HANDLE hFile = CreateFileW(
wstrFile.c_str(),
GENERIC_READ | ACCESS_SYSTEM_SECURITY,
FILE_SHARE_READ,
nullptr,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_SEQUENTIAL_SCAN,
nullptr);

if (hFile == INVALID_HANDLE_VALUE)
{
std::wcerr 

Подробнее здесь: [url]https://stackoverflow.com/questions/79818733/windows-c-api-backupread-is-stuck-when-trying-to-fetch-all-the-streams-of-a[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»