Как скопировать двоичный код исполняемого файла в новый файл без использования команды системного копирования? - PullRequest
1 голос
/ 22 января 2010

Это код, который у меня есть, но файл немного меньше и не выполняется:

int WriteFileContentsToNewFile(string inFilename, string outFilename)
{
    ifstream infile(inFilename.c_str(), ios::binary);
    ofstream outfile(outFilename.c_str(), ios::binary);

    string line;
    // Initial read
    infile >> line;
    outfile << line;
    // Read the rest
    while( infile )
    { 
        infile >> line;
        outfile << line;
    }

    infile.close();
    outfile.close();

    return 0;
}

Что я делаю не так? Есть ли лучший способ прочитать в двоичном файле исполняемого файла и сразу записать его под другим именем? Какие-нибудь примеры кода?

Мне нужно сделать это без системной копии, чтобы симулировать запись на диск.

Ответы [ 4 ]

4 голосов
/ 22 января 2010

Один из способов - использовать потоковый инсертор для streambuf:

int WriteFileContentsToNewFile(string inFilename, string outFilename)
{
    ifstream infile(inFilename.c_str(), ios::binary);
    ofstream outfile(outFilename.c_str(), ios::binary);

    outfile << infile.rdbuf();
}
2 голосов
/ 22 января 2010

Поток operator>>() выполняет форматированный ввод, даже если вы открываете поток в двоичном режиме. Отформатированный ввод ожидает увидеть строки печатаемых символов, разделенные пробелами, но это не то, из чего состоят двоичные файлы, такие как исполняемые файлы. Вам необходимо прочитать файл с помощью функции read() потока и записать его с помощью функции write() выходного потока.

0 голосов
/ 25 января 2010

(unix) системная команда cp не только копирует содержимое файла, но также копирует (некоторые) права доступа к файлу, включая бит выполнения.

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

0 голосов
/ 22 января 2010

С макушки головы: (без проверки ошибок)

РЕДАКТИРОВАТЬ: Изменено, чтобы исправить ошибку feof.

int WriteFileContentsToNewFile(string inFilename, string outFilename)
{
  FILE* in = fopen(inFilename.c_str(),"rb");
  FILE* out = fopen(outFilename.c_str(),"wb");
  char buf[4096]; //1024 is a habit of mine. 4096 is most likely your blocksize. it could also be 2<<13 instead.
  int len;
  while( (len = fread(buf,1,1024,in)) > 0 )
  {
    fwrite(buf,1,len,out);
  }
  fclose(in);
  fclose(out);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...