Перейти к содержанию
    

Я получаю файлы с компьютера. Мне приходит tar файл. Я распаковываю его и тут возникает вопрос

Как можно проверить на стороне эмбедед, что файл не повредился при передаче? Есть CRC для файлов?

 

Еще такой вопрос. Мне нужно скопировать полученные файлы в другое место и удалить их. Но я не нашел функции копирования файла в файл. Все функции копирования либо масив-масив либо файл-масив либо масив-файл.

FILE global_files[8];

void CopyFiles(void)
{
    FILE local_files[8];

    for (int i = 0; i < 8; i++)
   {
        copy (global_files[i],  local_files[i]);  //??? copy (char*, char*) - аргументы массивы
   }
}

 

Может можно сделать просто

copy ((char)*global_files[i], (char)* local_files[i]);

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я получаю файлы с компьютера. Мне приходит tar файл. Я распаковываю его и тут возникает вопрос

Как можно проверить на стороне эмбедед, что файл не повредился при передаче? Есть CRC для файлов?

Ну если вы распаковываете tar, должны знать, что в каждом блоке есть контрольная сумма.

struct posix_header
{                               /* byte offset */
...
  char chksum[8];               /* 148 */
...
};

 

Но я не нашел функции копирования файла в файл. Все функции копирования либо масив-масив либо файл-масив либо масив-файл.
Ну да. Всё руками.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну если вы распаковываете tar, должны знать, что в каждом блоке есть контрольная сумма.

struct posix_header
{                               /* byte offset */
...
  char chksum[8];               /* 148 */
...
};

а как мне вытащить контрольную сумму?

 

Ну да. Всё руками.

Руками получается так

FILE global_files[8];

STATUS TFTP_ProcessFiles(char *arc_name, char *file_name)
{
    int loc_fd, glob_fd;
    char buf[TFTP_BUFF_SIZE];
    
    tarExtract(arc_name,0, FALSE);
    
    for (int i = 0; i < TFTP_FILES_COUNT; i++)
    {
        strcat(file_name, (char *)48+i);
        loc_fd = open(file_name, O_RDONLY, 0644);
        glob_fd = open ????
        
        read(loc_fd, buf, TFTP_BUFF_SIZE);
        
        write(glob_fd, buf, TFTP_BUFF_SIZE);
        
        close(loc_fd);
        close(glob_fd);
        
        remove(loc_fd);    
    }
    
    return OK;
}

проблема тут glob_fd = open ????. как мне взять дескриптор глобального файла? он определен но не инициализирован.

 

нашел ф-цию для копирования

STATUS cp(const char * src, const char * dest);

но если src известен что я передаю в качестве dest?

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нашел ф-цию для копирования

STATUS cp(const char * src, const char * dest);

но если src известен что я передаю в качестве dest?

Вестимо имя файла (с путем), куда вы хотите скопировать свой исходный файл.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вестимо имя файла (с путем), куда вы хотите скопировать свой исходный файл.

а какое у него имя? вот я его создал FILE global_files[8]; я должен инициализировать файлы? А как? Я не нашел в структуре FILE член имя файла.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот я его создал FILE global_files[8]
Это неправильно. Не смотрите на FILE как на структуру. Используйте указатели FILE *. Объект типа FILE* создаётся функцией fopen().

Я не нашел в структуре FILE член имя файла.
Там его и нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это неправильно. Не смотрите на FILE как на структуру. Используйте указатели FILE *. Объект типа FILE* создаётся функцией fopen().

Там его и нет.

понял. спасибо.

ну как то так

    FILE *global_files[8];
    FILE *fsrc;

    
    for (i = 0; i < TFTP_FILES_COUNT; i++)
    {
        strcat(file_name, (char*)48+i);
        
        fsrc = open(file_name, O_RDONLY, 0644);
        global_files[i] = open(fname, O_RDONLY, 0644);
        
        cp(fsrc, global_files[i]);
        
        close(fsrc);
        close(global_files[i]);
        
        remove(fsrc);    
    }

 

я тут подумал. если я распаковал файлы успешно tarExtract( "/ram0/TFTP_FILES/test.tar", 0, FALSE); - это уже само по себе означает что архив пришел неповрежденный, иначе я бы упал на распаковке.

может быть такой случай что файлы в tar повредились и тем не менее архив распаковался успешно?

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

понял. спасибо.

Видимо, не до конца.

 

    FILE *global_files[8];
     FILE *fsrc;
         
         fsrc = open(file_name, O_RDONLY, 0644);
         global_files[i] = open(fname, O_RDONLY, 0644);

Вы видите разницу между open() и fopen()? Первая возвращает целое число, вторая FILE*. То же самое с clocse() и fclose().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

. . .

я тут подумал. если я распаковал файлы успешно tarExtract( "/ram0/TFTP_FILES/test.tar", 0, FALSE); - это уже само по себе означает что архив пришел неповрежденный, иначе я бы упал на распаковке.

может быть такой случай что файлы в tar повредились и тем не менее архив распаковался успешно?

 

tarExtract(arc_name,0, FALSE);

 

Посмотрите на декларацию ф-ии. ОНО что, void ?

Если есть код возрвата или структура со ссылкой на код и место ошибки - то (ее) его надо обрабатывать.

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

продолжить распаковку остальных.

Курите h-файлы и описание интерфейса функции.

 

ps

TAR - насколько знаю, TapeArchive, а на заре электричества ошибки ленточных носителей

были "очень и очень".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Видимо, не до конца.

 

Вы видите разницу между open() и fopen()? Первая возвращает целое число, вторая FILE*. То же самое с clocse() и fclose().

понял. спасибо.

 

 

 

tarExtract(arc_name,0, FALSE);

 

Посмотрите на декларацию ф-ии. ОНО что, void ?

Если есть код возрвата или структура со ссылкой на код и место ошибки - то (ее) его надо обрабатывать.

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

продолжить распаковку остальных.

Курите h-файлы и описание интерфейса функции.

 

ps

TAR - насколько знаю, TapeArchive, а на заре электричества ошибки ленточных носителей

были "очень и очень".

случай когда я упал на распаковке - он ясен.

вопрос в другом - может быть битый файл в архиве, который повредился при пересылке, и при этом архив распакуется успешно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вопрос в другом - может быть битый файл в архиве, который повредился при пересылке, и при этом архив распакуется успешно?
Теоритически да. По несовпадению CRC можно определить, что файл битый. Но это если размер файла не изменился. Если же какой-то кусок пропал или наоборот, что-то вставилось, то скорее всего нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Теоритически да. По несовпадению CRC можно определить, что файл битый. Но это если размер файла не изменился. Если же какой-то кусок пропал или наоборот, что-то вставилось, то скорее всего нет.

я понял. то есть надо искать пути валидации распакованного файла?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

TAR - насколько знаю, TapeArchive, а на заре электричества ошибки ленточных носителей были "очень и очень".

 

Как же я люблю людей, которые документацию читать не умеют, зато на основе "богатого жизненного опыта" делают какие-то выводы...

https://www.gnu.org/software/tar/manual/htm...ion/tar_84.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как же я люблю людей, которые документацию читать не умеют, зато на основе "богатого жизненного опыта" делают какие-то выводы...

https://www.gnu.org/software/tar/manual/htm...ion/tar_84.html

спасибо. интересный документ.

на основе него

Ideally, when tar is creating an archive, it reads from a file system that is not being modified, and encounters no errors or inconsistencies while reading and writing. If this is the case, the archive should faithfully reflect what was read. Similarly, when extracting from an archive, ideally tar ideally encounters no errors and the extracted files faithfully reflect what was in the archive.

я так понимаю валидацию делать таки надо. А как? Массив я проверяю с CRC. А с файлами как быть?

 

по моему нашел то что нужно - MD5 Checksum. Можно создавать и потом проверять после пересылки.

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как же я люблю людей, которые документацию читать не умеют, зато на основе "богатого жизненного опыта" делают какие-то выводы...

https://www.gnu.org/software/tar/manual/htm...ion/tar_84.html

Ну и что не так ?

GNU Tar

. . .

Initially, tar archives were used to store files conveniently on magnetic tape.

По указанной Вами ссылке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...