Как скопировать файл в C / C ++ с помощью libssh и sftp

Я пишу здесь, потому что мне нужна помощь с кодом, связанным с libssh.

Я прочитал всю официальную документацию Вот но все же я не понимаю, что мне нужно делать, если кто-то может осветить меня, я был бы рад.

На самом деле я хочу скопировать файл с клиента на удаленный сервер, но я не понимаю, как это сделать с библиотекой libssh и функцией sftp в libssh.

Ситуация такова: сессия ssh открыта и сессия sftp тоже открыта, я могу создать файл и записать его с клиента на сервер с интегрированной функцией lib ssh.

Я не нашел простой способ скопировать файл с клиента на сервер с помощью такой простой функции, как sftp_transfer (sourceFile (например, c: \ my document \ hello world.txt), RemoteFile (/ home / user / hello world.txt), справа (чтение и запись)) ?

Из того, что я понял из этого урока, сначала создается файл в удаленном месте (на сервере), а затем открывается этот файл с такой строкой кода:

file = sftp_open(sftp, "/home/helloworld.txt",access_type,1);

После этого файл создается на сервере, а затем записывается в этот созданный файл с буфером:

const char *helloworld = "Hello, World!\n";
int length = strlen(helloworld);
nwritten = sftp_write(file, helloworld, length);

Теперь у меня вопрос, есть ли у меня файл, например, файл .doc, и я хочу передать / загрузить этот файл из c: \ mydocument \ document.doc для удаленного удаленного сервера /home/user/document.doc. Как мне это сделать? это с этим методом?

Как я могу положить этот файл в sftp_write () функция, чтобы отправить его как helloworld в функции образца?

Возможно, я недостаточно хорош в программировании, чтобы понять, но я действительно пытался понять это, и я застрял с этим.

Заранее спасибо за помощь

Ниже приведен пример кода, который я использовал для тестирования:

// Set variable for the communication
char buffer[256];
unsigned int nbytes;

//create a file to send by SFTP
int access_type = O_WRONLY | O_CREAT | O_TRUNC;
const char *helloworld = "Hello, World!\n";
int length = strlen(helloworld);

//Open a SFTP session
sftp = sftp_new(my_ssh_session);
if (sftp == NULL)
{
fprintf(stderr, "Error allocating SFTP session: %s\n",
ssh_get_error(my_ssh_session));
return SSH_ERROR;
}
// Initialize the SFTP session
rc = sftp_init(sftp);
if (rc != SSH_OK)
{
fprintf(stderr, "Error initializing SFTP session: %s.\n",
sftp_get_error(sftp));
sftp_free(sftp);
return rc;
}

//Open the file into the remote side
file = sftp_open(sftp, "/home/helloworld.txt",access_type,1);
if (file == NULL)
{
fprintf(stderr, "Can't open file for writing: %s\n",ssh_get_error(my_ssh_session));
return SSH_ERROR;
}

//Write the file created with what's into the buffer
nwritten = sftp_write(file, helloworld, length);
if (nwritten != length)
{
fprintf(stderr, "Can't write data to file: %s\n",
ssh_get_error(my_ssh_session));
sftp_close(file);
return SSH_ERROR;
}

`

6

Решение

Откройте файл обычным способом (используя C ++ fstream или С stdio.h), прочитайте его содержимое в буфер и передайте его sftp_write,

Что-то вроде этого:

ifstream fin("file.doc", ios::binary);
if (fin) {
fin.seekg(0, ios::end);
ios::pos_type bufsize = fin.tellg(); // get file size in bytes
fin.seekg(0); // rewind to beginning of file

char* buf = new char[bufsize];
fin.read(buf, bufsize); // read file contents into buffer

sftp_write(file, buf, bufsize); // write to remote file
}

Обратите внимание, что это очень простая реализация. Вам, вероятно, следует открыть удаленный файл в режиме добавления, а затем записать данные в виде фрагментов вместо того, чтобы отправлять один большой массив данных.

4

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

В следующем примере используется ifstream в цикле, чтобы отменить загрузку целого файла в память (что делает принятый ответ):

ifstream fin("C:\\myfile.zip", ios::binary);

while (fin)
{
#define MAX_XFER_BUF_SIZE 10240
char buffer[MAX_XFER_BUF_SIZE];
fin.read(buffer, sizeof(buffer));
if (fin.gcount() > 0)
{
ssize_t nwritten = sftp_write(NULL, buffer, fin.gcount());
if (nwritten != fin.gcount())
{
fprintf(stderr, "Can't write data to file: %s\n", ssh_get_error(ssh_session));
sftp_close(file);
return 1;
}
}
}
0

Я использовал последовал примеру Вот.

sftp_read_sync использует бесконечный цикл для чтения файла с сервера в /path/to/profile
из пути к серверу /etc/profile,

-1
По вопросам рекламы [email protected]