Копирование файла между двумя ОС, если одна ОС является виртуальной

К сожалению, стандарт C++ не определяет стандартный способ работать с файлами и папками таким образом.

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

Кросс-платформенный метод повышения:

следующая функция, учитывая путь к каталогу и имя файла, рекурсивно ищет каталог и его подкаталоги для имени файла, возвращая bool, и, если успешный, путь к файлу, который был найден.

bool find_file(const path & dir_path,         // in this directory,
               const std::string & file_name, // search for this name,
               path & path_found)             // placing path here if found
{
    if (!exists(dir_path)) 
        return false;

    directory_iterator end_itr; // default construction yields past-the-end

    for (directory_iterator itr(dir_path); itr != end_itr; ++itr)
    {
        if (is_directory(itr->status()))
        {
            if (find_file(itr->path(), file_name, path_found)) 
                return true;
        }
        else if (itr->leaf() == file_name) // see below
        {
            path_found = itr->path();
            return true;
        }
    }
    return false;
}

Источник от страницы повышения упомянут выше.

Для основанных на Unix/Linux систем:

можно использовать opendir / readdir / closedir.

Пример кода, который ищет каталог запись ''имя'':

len = strlen(name);
dirp = opendir(".");
while ((dp = readdir(dirp)) != NULL)
        if (dp->d_namlen == len && !strcmp(dp->d_name, name)) {
                (void)closedir(dirp);
                return FOUND;
        }
(void)closedir(dirp);
return NOT_FOUND;

Исходный код из вышеупомянутых страниц справочника.

Для основанные на окнах системы:

можно использовать Win32 API FindFirstFile / FindNextFile / функции FindClose.

следующий пример C++ показывает Вам минимальное использование FindFirstFile.

#include 
#include 
#include 

void _tmain(int argc, TCHAR *argv[])
{
   WIN32_FIND_DATA FindFileData;
   HANDLE hFind;

   if( argc != 2 )
   {
      _tprintf(TEXT("Usage: %s [target_file]\n"), argv[0]);
      return;
   }

   _tprintf (TEXT("Target file is %s\n"), argv[1]);
   hFind = FindFirstFile(argv[1], &FindFileData);
   if (hFind == INVALID_HANDLE_VALUE) 
   {
      printf ("FindFirstFile failed (%d)\n", GetLastError());
      return;
   } 
   else 
   {
      _tprintf (TEXT("The first file found is %s\n"), 
                FindFileData.cFileName);
      FindClose(hFind);
   }
}

Исходный код от вышеупомянутых страниц MSDN.

2
задан 12.05.2020, 11:17

4 ответа

На базовой машине перейдите в виртуальный ящик -> настройки -> общие папки.

В Ubuntu эта папка будет доступна в разделе /media/sf_FOLDER-NAME.

Вам может потребоваться перезагрузка. Подробнее читайте в документации по VirtualBox

0
ответ дан 12.05.2020, 11:18

VirtualBox использует guest additions в качестве дополнительного инструмента, облегчающего работу между нативной и виртуальной машинами. Можно найти много инструкций, но это сработало для меня некоторое время назад:

HowTo

0
ответ дан 12.05.2020, 11:18

Вам не нужно полагаться на добавление Virtualbox.

Сначала вы должны создать общий каталог, скажем, мы хотим создать его в Ubuntu.

щелкните правой кнопкой мыши папку, которой вы хотите поделиться, затем перейдите к параметрам обмена, вы увидите это enter image description here

Теперь установите флажок рядом с «Поделиться этой папкой» и укажите разрешения вниз.

На вашем компьютере с Windows теперь запустите диалог запуска super + r Затем введите \\ Ubuntu-ip

Теперь вы можете показать общую папку и, таким образом, вы можете легко обмениваться файлами и папками

Для получения дополнительной информации проверьте это

0
ответ дан 12.05.2020, 11:19

Используйте winscp !

Это не зависит от того, какой гипервизор вы используете. Хостом может быть Windows или дистрибутив на основе Linux, используйте Wine, если работаете на дистрибутивах на основе Linux (я тестировал на Windows 7 и Ubuntu 12.10, работает без всяких проблем).

Это даст вам графический интерфейс для перетаскивания файлов с / на виртуальную машину с хост-ОС.

Вам необходимо указать IP-адрес хоста, к которому вы подключаетесь с хоста. Чтобы узнать IP-адрес виртуальной машины Ubuntu, введите ifconfig на терминале в виртуальной машине.

winscp home screen

При нажатии «Логин», вам будет выдано предупреждение, чтобы принять это соединение или отказаться.

warning

Примите это, если вы доверяете ВМ.

file explorer

Вы можете скопировать вставленные файлы отсюда.

0
ответ дан 12.05.2020, 11:20

Теги

Похожие вопросы