Следующий код C ++ может загружать файлы с диска Google
...
googleapis::StringPiece strpc = filePtr->get_download_url();
googleapis::client::HttpTransport* ptrHttp = service_->transport();
string filePath("C:/temp/"+filePtr->get_title().as_string());
googleapis::client::DataWriter *dataPtr = googleapis::client::NewFileDataWriter(filePath);
googleapis::client::HttpRequest *ptrHttpReq =
ptrHttp->NewHttpRequest(googleapis::client::HttpRequest::GET);
ptrHttpReq->set_url(strpc.as_string());
ptrHttpReq->set_content_writer(dataPtr);
ptrHttpReq->set_credential(&credential_);
googleapis::util::Status rsp = ptrHttpReq->Execute();
...
Но полученные файлы в локальном каталоге Windows NTFS повреждены (в основном, изображения). Похоже, классическая проблема EOL эмиссии CR LF проблема преобразования. Бинарное сравнение показывает, что «0A» заменяется на «0D 0A», а размеры файлов в локальных папках постоянно на 1 КБ больше, чем размер на диске.
У меня есть скриншот шестнадцатеричного дифференциала, прикрепленного здесь.
Эта проблема не возникает, когда я напрямую загружаю те же файлы с диска Google через их клиент браузера (щелкните правой кнопкой мыши> скачать)
Вот несколько файлов, размер которых постоянно отличается
Downloaded file size
bytes on disk (NTFS)
283374 ---> 284427 delta of 1053
224201 ---> 225025 delta of 824
248961 ---> 249874 delta of 916
249438 ---> 250413 delta of 975
Кроме того, размер буфера, сообщаемый DataWriter при записи, такой же, как сообщается в клиенте браузера через информацию о файле — поэтому полученная полезная нагрузка в ответе http равна размеру диска. Я полагаю, что проблема, вероятно, будет во время записи файла.
Есть ли какая-либо постобработка двоичного потока, которую мне нужно сделать, когда файл записан? Я не могу сказать, на каком уровне эта проблема закрадывается.
Похожая проблема сообщается здесь, в стеке потока, но я не вижу никаких изменений при попытке установить тип содержимого файла в объекте HttpRequest
Задача ещё не решена.
Других решений пока нет …