Передача файлов в C - PullRequest
       23

Передача файлов в C

0 голосов
/ 24 июня 2010

Как мне перенести файлы из одной папки в другую, где обе папки присутствуют в домашней директории oracle?

int main(int argc, char *argv[]){
    char *home, *tmp2;
    home = getenv("ORACLE_HOME");
    temp2 = getenv("ORACLE_HOME");
    strcat (home,"A");
    strcat (tmp2,"B");

//transfer files from home to tmp2

}

strcat не работает.Здесь я вижу, что указатель tmp2 не обновляется корректно.

Редактировать: ОС - это компьютер на базе UNIX.Код отредактирован.Мне требуется двоичный файл, который выполняет это копирование, с намерением, что настоящий код не может быть просмотрен.Следовательно, я не рассматривал использование сценария оболочки в качестве опции.Файлы в A шифруются, а затем копируются в B, дешифруются в B и запускаются.Поскольку файлы находятся в Perl, я собираюсь использовать системную команду для запуска их в одном и том же C-коде.

Ответы [ 4 ]

1 голос
/ 26 июня 2010

Использование команды system(3), вероятно, является хорошей идеей, поскольку вы получаете удобство интерпретатора оболочки для расширения имен файлов (через *), но избегаете хлопот вычисления точной длины буфера, необходимого для печати команды, используябуфер фиксированной длины и гарантирующий, что он не может переполниться:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define BUFSZ 0xFFF
int main(void)
{
    char * ohome = getenv("ORACLE_HOME"), cmd[BUFSZ];
    char * fmt="/bin/mv %s/%s/* %s/%s";
    int written = snprintf(cmd, BUFSZ, fmt, ohome, "A", ohome, "B"), ret;
    if ((written < 0) || (written >= (BUFSZ-1))) {
      /* ERROR: print error or ORACLE_HOME env var too long for BUFSZ. */
    }
    if ((ret = system(cmd)) == 0) {
      /* OK, move succeeded. */
    }
    return 0;
}

Как отмечает комментатор Paul Kuliniewicz, могут возникнуть непредвиденные результаты, если ваш ORACLE_HOME содержит пробелы или другие специальные символы, которые могут интерпретироваться подоболочкой в ​​"системе"команда.Использование одного из семейств execl или execv позволит вам создавать аргументы, не беспокоясь о том, что интерпретатор оболочки выполняет свою собственную интерпретацию, но за счет использования подстановочных знаков.

1 голос
/ 26 июня 2010

Прежде всего, как указывалось ранее, эта ваша "безопасность" совершенно бесполезна.Перехватывать копируемые файлы тривиально (существует множество инструментов для отслеживания изменений файловой системы и т. Д.), Но это другая история.

Вот как вы могли бы это сделать, для первой части.Чтобы выполнить фактическое копирование, вам придется либо использовать system (), либо прочитать весь файл, а затем записать его снова, что довольно долго для такого вида быстрого копирования.

int main(int argc, char *argv[]){
  char *home, *tmp2;
  home = strdup(getenv("ORACLE_HOME"));
  tmp2 = strdup(getenv("ORACLE_HOME"));
  home = realloc(home, strlen(home)+strlen("A")+1);
  tmp2 = realloc(tmp2, strlen(tmp2)+strlen("B")+1);
  strcat (home,"A");
  strcat (tmp2,"B");
}

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

rename(home,tmp2);
0 голосов
/ 26 июня 2010

Быстрый способ выполнить передачу - использовать команду оболочки cp для копирования, но вызывать ее с помощью команды system вместо использования сценария оболочки.

Или попросите вашу C-программу создать сценарий оболочки, чтобы выполнить копирование, запустить сценарий оболочки, а затем удалить его.

0 голосов
/ 26 июня 2010

Не соответствует тому, что вы спрашиваете, но комментарий к вашему коду:

Вы, вероятно, не сможете strcat к результатам getenv, потому что getenv может (в некоторых средах) возвращать указатель на постоянную память. Вместо этого создайте новый буфер и strcpy результаты getenv в него, а затем strcat оставшееся имя файла.

...