чтение файла gsoap c

Я новичок в C ++. Я написал файл загрузки wcf в c # и gsoap2.8 для создания файла header.h.

Это мой файл загрузки файлов службы wcf в c #.

public void UploadFile(RemoteFileInfo request)
{
FileStream targetStream = null;
Stream sourceStream = request.FileByteStream;

string uploadFolder = @"C:\temp\upload\copyHere";
string filePath = Path.Combine(uploadFolder, request.FileName);

using (targetStream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None))
{
//read from the input stream in 6K chunks
//and save to output stream
const int bufferLen = 65000;
byte[] buffer = new byte[bufferLen];
int count = 0;
while ((count = sourceStream.Read(buffer, 0, bufferLen)) > 0)
{
targetStream.Write(buffer, 0, count);
}
targetStream.Close();
sourceStream.Close();
}

}

Ниже приведен код header.h, сгенерированный gsoap2.8 из wsdl:

class SOAP_CMAC xsd__base64Binary
{
public:
unsigned char *__ptr;
int __size;
char *id;   /* optional element of type xsd:string */
char *type; /* optional element of type xsd:string */
char *options;  /* optional element of type xsd:string */
struct soap *soap;  /* transient */
public:
virtual int soap_type() const { return 8; } /* = unique id SOAP_TYPE_xsd__base64Binary */
virtual void soap_default(struct soap*);
virtual void soap_serialize(struct soap*) const;
virtual int soap_put(struct soap*, const char*, const char*) const;
virtual int soap_out(struct soap*, const char*, int, const char*) const;
virtual void *soap_get(struct soap*, const char*, const char*);
virtual void *soap_in(struct soap*, const char*, const char*);
xsd__base64Binary() { xsd__base64Binary::soap_default(NULL); }
virtual ~xsd__base64Binary() { }
};

class SOAP_CMAC _ns1__RemoteFileInfo
{
public:
xsd__base64Binary FileByteStream;   /* SOAP 1.2 RPC return element (when namespace qualified) */    /* required element of type ns2:StreamBody */
struct soap *soap;  /* transient */
public:
virtual int soap_type() const { return 14; } /* = unique id SOAP_TYPE__ns1__RemoteFileInfo */
virtual void soap_default(struct soap*);
virtual void soap_serialize(struct soap*) const;
virtual int soap_put(struct soap*, const char*, const char*) const;
virtual int soap_out(struct soap*, const char*, int, const char*) const;
virtual void *soap_get(struct soap*, const char*, const char*);
virtual void *soap_in(struct soap*, const char*, const char*);
_ns1__RemoteFileInfo() { _ns1__RemoteFileInfo::soap_default(NULL); }
virtual ~_ns1__RemoteFileInfo() { }
};

Вот мой код test.cpp. Мне нужно прочитать файл в xsd__base64Binary так что я могу назначить для remoteFile.FileByteStream

BasicHttpBinding_USCOREITransferService svc;
__ns1__UploadFileResponse uploadRespond;
_ns1__RemoteFileInfo remoteFile;

std::string path = "C:\\temp\\upload\\test.txt";

мне нужно прочитать вышеуказанный файл в
????

remoteFile.FileByteStream = ?

поэтому я могу вызвать веб-сервис uploadFile, как показано ниже:

int result = svc.__ns1__UploadFile(&remoteFile, uploadRespond);

Заранее спасибо,

JH

2

Решение

Вот пример в c:

    unsigned char * buffer;
int fileLen;
FILE *file;

//OPEN FILE
file = fopen(name, "rb");
if (!file)
{
fprintf(stderr, "Unable to open file %s", name);
return;
}

//GET FILE LENGTH
fseek(file, 0, SEEK_END);
fileLen=ftell(file);
fseek(file, 0, SEEK_SET);

//ALLOCATE MEMORY
buffer=(unsigned char *)malloc(fileLen+1);
if (!buffer)
{
fprintf(stderr, "Memory error! :( ");
fclose(file);
return;
}

//READ FILE CONTENTS INTO BUFFER AND CLOSE FILE
fread(buffer, fileLen, 1, file);
fclose(file);

//USE THE BUFFER ....//FREE YOUR ALLOCATED BUFFER
free(buffer);

В вашем уд_файл:

remoteFile.FileByteStream.__ptr = buffer;
remoteFile.FileByteStream.__size = fileLen;

ОБНОВЛЕНИЕ: выделить память с помощью soap_malloc

Использование:

buffer=(unsigned char *)soap_malloc(soap,fileLen+1);

Вместо:

buffer=(unsigned char *)malloc(fileLen+1);

Удалить:

free(buffer);

Распределение будет сделано в контексте текущей операции, свободно будет сделано библиотекой gsoal после завершения операции.

2

Другие решения

Других решений пока нет …