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

 
 
> Работа с файлами
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
 
Start new topic
Ответов
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
Jenya7
сообщение Oct 19 2017, 18:12
Сообщение #9


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

Группа: Участник
Сообщений: 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
Сообщение #10


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

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


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

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



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

я понял. то есть надо искать пути валидации распакованного файла?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Jenya7   Работа с файлами   Oct 18 2017, 08:21
|- - k155la3   Цитата(Jenya7 @ Oct 18 2017, 17:35) . . ....   Oct 19 2017, 17:39
|- - esaulenka   Цитата(k155la3 @ Oct 19 2017, 20:39) TAR ...   Oct 20 2017, 07:45
|- - Jenya7   Цитата(esaulenka @ Oct 20 2017, 13:45) Ка...   Oct 20 2017, 08:43
|- - k155la3   Цитата(esaulenka @ Oct 20 2017, 10:45) Ка...   Oct 21 2017, 13:08
- - Jenya7   Такой вопрос. Я должен прочитать из файла провероч...   Nov 14 2017, 06:41
- - XVR   Цитатаchar *checksum_buff = "";Так нельз...   Nov 14 2017, 08:32
- - k155la3   Код[quote] while ( (c = fgetc...   Nov 14 2017, 09:32
- - Jenya7   Цитата(k155la3 @ Nov 14 2017, 14:32) Код...   Nov 14 2017, 09:48


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

 


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


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