jenya7 0 18 октября, 2017 Опубликовано 18 октября, 2017 (изменено) · Жалоба Я получаю файлы с компьютера. Мне приходит 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]); Изменено 18 октября, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 18 октября, 2017 Опубликовано 18 октября, 2017 · Жалоба Я получаю файлы с компьютера. Мне приходит tar файл. Я распаковываю его и тут возникает вопрос Как можно проверить на стороне эмбедед, что файл не повредился при передаче? Есть CRC для файлов? Ну если вы распаковываете tar, должны знать, что в каждом блоке есть контрольная сумма. struct posix_header { /* byte offset */ ... char chksum[8]; /* 148 */ ... }; Но я не нашел функции копирования файла в файл. Все функции копирования либо масив-масив либо файл-масив либо масив-файл.Ну да. Всё руками. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 18 октября, 2017 Опубликовано 18 октября, 2017 (изменено) · Жалоба Ну если вы распаковываете 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? Изменено 18 октября, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 18 октября, 2017 Опубликовано 18 октября, 2017 · Жалоба нашел ф-цию для копирования STATUS cp(const char * src, const char * dest); но если src известен что я передаю в качестве dest? Вестимо имя файла (с путем), куда вы хотите скопировать свой исходный файл. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 18 октября, 2017 Опубликовано 18 октября, 2017 · Жалоба Вестимо имя файла (с путем), куда вы хотите скопировать свой исходный файл. а какое у него имя? вот я его создал FILE global_files[8]; я должен инициализировать файлы? А как? Я не нашел в структуре FILE член имя файла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 18 октября, 2017 Опубликовано 18 октября, 2017 · Жалоба вот я его создал FILE global_files[8]Это неправильно. Не смотрите на FILE как на структуру. Используйте указатели FILE *. Объект типа FILE* создаётся функцией fopen(). Я не нашел в структуре FILE член имя файла.Там его и нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 18 октября, 2017 Опубликовано 18 октября, 2017 (изменено) · Жалоба Это неправильно. Не смотрите на 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 повредились и тем не менее архив распаковался успешно? Изменено 18 октября, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 19 октября, 2017 Опубликовано 19 октября, 2017 · Жалоба понял. спасибо. Видимо, не до конца. 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(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 19 октября, 2017 Опубликовано 19 октября, 2017 · Жалоба . . . я тут подумал. если я распаковал файлы успешно tarExtract( "/ram0/TFTP_FILES/test.tar", 0, FALSE); - это уже само по себе означает что архив пришел неповрежденный, иначе я бы упал на распаковке. может быть такой случай что файлы в tar повредились и тем не менее архив распаковался успешно? tarExtract(arc_name,0, FALSE); Посмотрите на декларацию ф-ии. ОНО что, void ? Если есть код возрвата или структура со ссылкой на код и место ошибки - то (ее) его надо обрабатывать. Архив может содржать несколько файлов, а битым окажется один. Соотв-но после ошибки можно попытаться продолжить распаковку остальных. Курите h-файлы и описание интерфейса функции. ps TAR - насколько знаю, TapeArchive, а на заре электричества ошибки ленточных носителей были "очень и очень". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 19 октября, 2017 Опубликовано 19 октября, 2017 · Жалоба Видимо, не до конца. Вы видите разницу между open() и fopen()? Первая возвращает целое число, вторая FILE*. То же самое с clocse() и fclose(). понял. спасибо. tarExtract(arc_name,0, FALSE); Посмотрите на декларацию ф-ии. ОНО что, void ? Если есть код возрвата или структура со ссылкой на код и место ошибки - то (ее) его надо обрабатывать. Архив может содржать несколько файлов, а битым окажется один. Соотв-но после ошибки можно попытаться продолжить распаковку остальных. Курите h-файлы и описание интерфейса функции. ps TAR - насколько знаю, TapeArchive, а на заре электричества ошибки ленточных носителей были "очень и очень". случай когда я упал на распаковке - он ясен. вопрос в другом - может быть битый файл в архиве, который повредился при пересылке, и при этом архив распакуется успешно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 20 октября, 2017 Опубликовано 20 октября, 2017 · Жалоба вопрос в другом - может быть битый файл в архиве, который повредился при пересылке, и при этом архив распакуется успешно?Теоритически да. По несовпадению CRC можно определить, что файл битый. Но это если размер файла не изменился. Если же какой-то кусок пропал или наоборот, что-то вставилось, то скорее всего нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 20 октября, 2017 Опубликовано 20 октября, 2017 · Жалоба Теоритически да. По несовпадению CRC можно определить, что файл битый. Но это если размер файла не изменился. Если же какой-то кусок пропал или наоборот, что-то вставилось, то скорее всего нет. я понял. то есть надо искать пути валидации распакованного файла? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 20 октября, 2017 Опубликовано 20 октября, 2017 · Жалоба TAR - насколько знаю, TapeArchive, а на заре электричества ошибки ленточных носителей были "очень и очень". Как же я люблю людей, которые документацию читать не умеют, зато на основе "богатого жизненного опыта" делают какие-то выводы... https://www.gnu.org/software/tar/manual/htm...ion/tar_84.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 20 октября, 2017 Опубликовано 20 октября, 2017 (изменено) · Жалоба Как же я люблю людей, которые документацию читать не умеют, зато на основе "богатого жизненного опыта" делают какие-то выводы... 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. Можно создавать и потом проверять после пересылки. Изменено 20 октября, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 21 октября, 2017 Опубликовано 21 октября, 2017 · Жалоба Как же я люблю людей, которые документацию читать не умеют, зато на основе "богатого жизненного опыта" делают какие-то выводы... 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. По указанной Вами ссылке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться