|
Работа с файлами |
|
|
|
Oct 18 2017, 08:21
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Я получаю файлы с компьютера. Мне приходит 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 - Oct 18 2017, 08:43
|
|
|
|
|
Oct 18 2017, 08:47
|
Профессионал
    
Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757

|
Цитата(Jenya7 @ Oct 18 2017, 11:21)  Я получаю файлы с компьютера. Мне приходит tar файл. Я распаковываю его и тут возникает вопрос Как можно проверить на стороне эмбедед, что файл не повредился при передаче? Есть CRC для файлов? Ну если вы распаковываете tar, должны знать, что в каждом блоке есть контрольная сумма. Код struct posix_header { /* byte offset */ ... char chksum[8]; /* 148 */ ... }; Цитата Но я не нашел функции копирования файла в файл. Все функции копирования либо масив-масив либо файл-масив либо масив-файл. Ну да. Всё руками.
|
|
|
|
|
Oct 18 2017, 09:09
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(andrew_b @ Oct 18 2017, 13:47)  Ну если вы распаковываете tar, должны знать, что в каждом блоке есть контрольная сумма. Код struct posix_header { /* byte offset */ ... char chksum[8]; /* 148 */ ... }; а как мне вытащить контрольную сумму? Цитата(andrew_b @ Oct 18 2017, 13:47)  Ну да. Всё руками. Руками получается так Код 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 - Oct 18 2017, 11:00
|
|
|
|
|
Oct 18 2017, 14:28
|
Профессионал
    
Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757

|
Цитата(Jenya7 @ Oct 18 2017, 15:59)  вот я его создал FILE global_files[8] Это неправильно. Не смотрите на FILE как на структуру. Используйте указатели FILE *. Объект типа FILE* создаётся функцией fopen(). Цитата Я не нашел в структуре FILE член имя файла. Там его и нет.
|
|
|
|
|
Oct 18 2017, 14:35
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(andrew_b @ Oct 18 2017, 19:28)  Это неправильно. Не смотрите на 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 - Oct 18 2017, 15:24
|
|
|
|
|
Oct 19 2017, 05:23
|
Профессионал
    
Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757

|
Цитата(Jenya7 @ Oct 18 2017, 17:35)  понял. спасибо. Видимо, не до конца. Цитата Код 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().
|
|
|
|
|
Oct 19 2017, 17:39
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(Jenya7 @ Oct 18 2017, 17:35)  . . . я тут подумал. если я распаковал файлы успешно tarExtract( "/ram0/TFTP_FILES/test.tar", 0, FALSE); - это уже само по себе означает что архив пришел неповрежденный, иначе я бы упал на распаковке. может быть такой случай что файлы в tar повредились и тем не менее архив распаковался успешно? tarExtract(arc_name,0, FALSE); Посмотрите на декларацию ф-ии. ОНО что, void ? Если есть код возрвата или структура со ссылкой на код и место ошибки - то (ее) его надо обрабатывать. Архив может содржать несколько файлов, а битым окажется один. Соотв-но после ошибки можно попытаться продолжить распаковку остальных. Курите h-файлы и описание интерфейса функции. ps TAR - насколько знаю, TapeArchive, а на заре электричества ошибки ленточных носителей были "очень и очень".
|
|
|
|
|
Oct 19 2017, 18:12
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(andrew_b @ Oct 19 2017, 10:23)  Видимо, не до конца.
Вы видите разницу между open() и fopen()? Первая возвращает целое число, вторая FILE*. То же самое с clocse() и fclose(). понял. спасибо. Цитата(k155la3 @ Oct 19 2017, 22:39)  tarExtract(arc_name,0, FALSE);
Посмотрите на декларацию ф-ии. ОНО что, void ? Если есть код возрвата или структура со ссылкой на код и место ошибки - то (ее) его надо обрабатывать. Архив может содржать несколько файлов, а битым окажется один. Соотв-но после ошибки можно попытаться продолжить распаковку остальных. Курите h-файлы и описание интерфейса функции.
ps TAR - насколько знаю, TapeArchive, а на заре электричества ошибки ленточных носителей были "очень и очень". случай когда я упал на распаковке - он ясен. вопрос в другом - может быть битый файл в архиве, который повредился при пересылке, и при этом архив распакуется успешно?
|
|
|
|
|
Oct 20 2017, 08:43
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(esaulenka @ Oct 20 2017, 13:45)  Как же я люблю людей, которые документацию читать не умеют, зато на основе "богатого жизненного опыта" делают какие-то выводы... 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 - Oct 20 2017, 09:30
|
|
|
|
|
Oct 21 2017, 13:08
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(esaulenka @ Oct 20 2017, 10:45)  Как же я люблю людей, которые документацию читать не умеют, зато на основе "богатого жизненного опыта" делают какие-то выводы... 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. По указанной Вами ссылке.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|