реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Работа с файлами
Jenya7
сообщение Oct 18 2017, 08:21
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Oct 18 2017, 08:47
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 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 */
...
};


Цитата
Но я не нашел функции копирования файла в файл. Все функции копирования либо масив-масив либо файл-масив либо масив-файл.
Ну да. Всё руками.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 18 2017, 09:09
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 18 2017, 12:53
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Jenya7 @ Oct 18 2017, 12:09) *
нашел ф-цию для копирования
STATUS cp(const char * src, const char * dest);
но если src известен что я передаю в качестве dest?
Вестимо имя файла (с путем), куда вы хотите скопировать свой исходный файл.

Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 18 2017, 12:59
Сообщение #5


Профессионал
*****

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



Цитата(XVR @ Oct 18 2017, 17:53) *
Вестимо имя файла (с путем), куда вы хотите скопировать свой исходный файл.

а какое у него имя? вот я его создал FILE global_files[8]; я должен инициализировать файлы? А как? Я не нашел в структуре FILE член имя файла.
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Oct 18 2017, 14:28
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(Jenya7 @ Oct 18 2017, 15:59) *
вот я его создал FILE global_files[8]
Это неправильно. Не смотрите на FILE как на структуру. Используйте указатели FILE *. Объект типа FILE* создаётся функцией fopen().
Цитата
Я не нашел в структуре FILE член имя файла.
Там его и нет.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 18 2017, 14:35
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Oct 19 2017, 05:23
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 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().
Go to the top of the page
 
+Quote Post
k155la3
сообщение Oct 19 2017, 17:39
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 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, а на заре электричества ошибки ленточных носителей
были "очень и очень".
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 19 2017, 18:12
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 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, а на заре электричества ошибки ленточных носителей
были "очень и очень".

случай когда я упал на распаковке - он ясен.
вопрос в другом - может быть битый файл в архиве, который повредился при пересылке, и при этом архив распакуется успешно?
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Oct 20 2017, 05:26
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(Jenya7 @ Oct 19 2017, 21:12) *
вопрос в другом - может быть битый файл в архиве, который повредился при пересылке, и при этом архив распакуется успешно?
Теоритически да. По несовпадению CRC можно определить, что файл битый. Но это если размер файла не изменился. Если же какой-то кусок пропал или наоборот, что-то вставилось, то скорее всего нет.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 20 2017, 07:33
Сообщение #12


Профессионал
*****

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



Цитата(andrew_b @ Oct 20 2017, 11:26) *
Теоритически да. По несовпадению CRC можно определить, что файл битый. Но это если размер файла не изменился. Если же какой-то кусок пропал или наоборот, что-то вставилось, то скорее всего нет.

я понял. то есть надо искать пути валидации распакованного файла?
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Oct 20 2017, 07:45
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(k155la3 @ Oct 19 2017, 20:39) *
TAR - насколько знаю, TapeArchive, а на заре электричества ошибки ленточных носителей были "очень и очень".


Как же я люблю людей, которые документацию читать не умеют, зато на основе "богатого жизненного опыта" делают какие-то выводы...
https://www.gnu.org/software/tar/manual/htm...ion/tar_84.html


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 20 2017, 08:43
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
k155la3
сообщение Oct 21 2017, 13:08
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 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.

По указанной Вами ссылке.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 15:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01462 секунд с 7
ELECTRONIX ©2004-2016