Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Одновременная запись и копирование, Работа с файлами 
:(
    Опции темы
Adry
Дата 6.10.2011, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 13.4.2011

Репутация: нет
Всего: нет



Есть такая задача (уточню: под Винду)

Имеется софтинка, которая работает с нашей аппаратурой, собирает информацию, пишет в два файла. 
Аппаратура может непрерывно работать несколько суток подряд, информация идет непрерывно, обращения к фалам происходят примерно раз в секунду. 
Иногда возникает необходимость просмотреть уже собранную информацию. Банально скопировать уже собранные данные на флешку, например. Сейчас я, чтобы это сделать, руками из программы останавливаю сбор информации вообще, благо 5-10 секунд задержки большой роли не сыграют: данные сохраняются в буфере той самой аппаратуры, а вычитываю я их быстрее, чем они туда падают.
Если запись не остановить, естественно, программа обращается к файлу, видит, что он используется уже кем-то другим, выдает ошибку и закрывается.

Конечно, можно зациклить программу, чтобы она останавливала сбор информации автоматически.
Но, может быть, есть какие-то другие варианты? 


PM MAIL   Вверх
borisbn
Дата 6.10.2011, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Изменять программу можно ?

Цитата(Adry @  6.10.2011,  08:04 Найти цитируемый пост)
программа обращается к файлу, видит, что он используется уже кем-то другим

при копировании ?  smile чем копируешь ? FAR, Total, Explorer ?

Цитата(Adry @  6.10.2011,  08:04 Найти цитируемый пост)
обращения к фалам происходят примерно раз в секунду

ссылку на видео, пожалуйста  smile 



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Adry
Дата 6.10.2011, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 13.4.2011

Репутация: нет
Всего: нет



Цитата(borisbn @  6.10.2011,  08:20 Найти цитируемый пост)
чем копируешь ?


Исесьно. Подходит дядечка-астрофизик с флешкой, открывает Тотал или Експлорер и пытается скопировать себе на флешку то, что детекторы насобирали. Тут от мене ничего не зависит: надо ставить "защиту от дурака"

Цитата(borisbn @  6.10.2011,  08:20 Найти цитируемый пост)
ссылку на видео, пожалуйста 


Нет, не астрофизики с флешками раз в секунду бегают....smile)))))))) 
Показания с детекторов сбрасываются раз в секунду....smile)


Изменять программу можно и нужно...smile
PM MAIL   Вверх
math64
Дата 6.10.2011, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Пусть твоя программа раз минуту делает копии файлов в другом каталоге, пусть астрофизики их оттуда забирают, а в оригинальный каталог их не пускай
Для создания копии к оригиналу можно не обращаться, а запоминать изменения в ОЗУ и раз в минуту их дописывать (надеюсь, ОЗУ хватит для хранения 1 минуты данных).
PM   Вверх
borisbn
Дата 6.10.2011, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Adry @  6.10.2011,  08:34 Найти цитируемый пост)
Изменять программу можно и нужно...

1. Как вариант - записывать данные во временный файл (убрать его с глаз, например куда-нибудь в Temp) и каждую минуту закрывать его, переносить в боевой каталог с новым именем, и создавать этот временный заново
2. Вообще-то, копирование файла не захватывает его, и писать в него в это время можно. Покажи код создания файла и записи в него.


посмотри внимательно, что я процитировал перед фразой "ссылку на видео, пожалуйста"

Добавлено через 1 минуту и 7 секунд
P.S. По поводу одной минуты мы с math64 не сговаривались - писАли одновременно smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
math64
Дата 6.10.2011, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Можно и так: подходит астрофизик к компу, вставляет флешку, твоя программа видит, что появилась флешка, копирует данные на флешку, отмонтироует флешку ("безопасное извлечение") и говорит забирай.
PM   Вверх
bsa
Дата 6.10.2011, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



А может просто убрать запрет совместного доступа на чтение с файла?
PM   Вверх
math64
Дата 6.10.2011, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



А программа, которая снимает данные досовская? Тогда винда увидит изменения в файле только после его закрытия, и никакого совместного доступа быть не может.
PM   Вверх
Adry
Дата 6.10.2011, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 13.4.2011

Репутация: нет
Всего: нет



Цитата(borisbn @  6.10.2011,  08:20 Найти цитируемый пост)
Цитата(Adry @  6.10.2011,  08:04 )обращения к фалам происходят примерно раз в секунду

ссылку на видео, пожалуйста   


"Вот, я не понял, шо ты имела в виду" (с).... 
Я маленькая, глупая. Не догоняю, что здесь не так, кроме пропущенной в слове "файлам" буквы "й".... :(((
 

 Фал:
1) Трос, веревка, канат для подъема парусов, сигнальных флагов и т.п.
2) Страховочный трос у летчиков, космонавтов и т.п.

Не?


Цитата(math64 @  6.10.2011,  13:24 Найти цитируемый пост)
Пусть твоя программа раз минуту делает копии файлов в другом каталоге, пусть астрофизики их оттуда забирают, а в оригинальный каталог их не пускай


Цитата(borisbn @  6.10.2011,  13:25 Найти цитируемый пост)
1. Как вариант - записывать данные во временный файл (убрать его с глаз, например куда-нибудь в Temp) и каждую минуту закрывать его, переносить в боевой каталог с новым именем, и создавать этот временный заново



Да! Это то, что нужно!

Цитата(borisbn @  6.10.2011,  13:25 Найти цитируемый пост)
2. Вообще-то, копирование файла не захватывает его, и писать в него в это время можно. Покажи код создания файла и записи в него.


Тут все на уровне начальной школы


Создание файла и разрешение записи
Код

void CConnect::OnBnOpenFile()
{
    //Научная телеметрия. Создание файла
    CString sN_TMname;

    OnOpen();

    if (TM_FNameflag==1)
    {
        GetDlgItemText(IDC_EDIT3, N_TMfile);
        sN_TMname=N_TMfile.GetBuffer();

            for (int cn=0; cn<=strlen(sN_TMname); cn++) 
            {    
                N_TMname[cn] = sN_TMname[cn];
                
            }

    }
    
}

void CConnect::OnOpen()
{
    CFileDialog fileDialog(TRUE);        //объект класса выбора файла
    int result = fileDialog.DoModal();    //запустить диалоговое окно
    if (result==IDOK)                    //если файл выбран
    {
        TM_FNameflag=1;
        SetDlgItemText(IDC_EDIT3, fileDialog.GetPathName());
    }
    else
    {
        TM_FNameflag=0;
        AfxMessageBox("Файл не выбран!!");
    }
}


void CConnect::OnBnStartWriteing()
{    
    
    //Научная телеметрия. Запись

    StartWr=1;
    StopWr=0;
    

    TelemetryFlag=1;
    SaveingTelemertyFlag=1;

    n_tm = fopen(N_TMname, "ab");
    fclose(n_tm);
    //n_tm=NULL;

}



Собственно, запись

Код

void CAutomatTM::SavingData()
{
    n_tm = fopen(N_TMname, "ab");
        
        for (int asd=4; asd<Word_Of_TM_Num; asd++) fputc(Word_Of_TM[asd], n_tm); 
        
        for (int asd=Word_Of_TM_Num; asd<=Word_Of_TM_Num+3;asd++)
        {
            Word_Of_TM[asd]=0x00;
            fputc(Word_Of_TM[asd], n_tm); 
        }

        TM_Ready=0;
                
    fclose(n_tm);
    //n_tm=NULL;

}



Добавлено через 2 минуты и 28 секунд
Цитата(bsa @  6.10.2011,  14:53 Найти цитируемый пост)
А может просто убрать запрет совместного доступа на чтение с файла?


А как?
PM MAIL   Вверх
borisbn
Дата 6.10.2011, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Adry @  6.10.2011,  15:56 Найти цитируемый пост)
"Вот, я не понял, шо ты имела в виду" (с).... 

nevermind

По делу:
1. В документации по ф-ции fopen сказано
Цитата
Always check the return value to see if the pointer is NULL before performing any further operations on the file. 

А ты этого не делаешь. Плёхо!

2. Попробуй открывать с параметром "a+b"

3. fputc записывает в файл один символ. Это - медленно. Лучше сделать так:
вместо
Цитата
for (int asd=4; asd<Word_Of_TM_Num; asd++) fputc(Word_Of_TM[asd], n_tm); 

Код
fwrite( &Word_Of_TM[ 4 ], sizeof( *Word_Of_TM ), Word_Of_TM_Num - 4, n_tm );

а вместо

Цитата(Adry @  6.10.2011,  15:56 Найти цитируемый пост)

for (int asd=Word_Of_TM_Num; asd<=Word_Of_TM_Num+3;asd++)
{
    Word_Of_TM[asd]=0x00;
    fputc(Word_Of_TM[asd], n_tm); 
}

Цитата

memset( &Word_Of_TM[ Word_Of_TM_Num ], 0, 4 * sizeof( *Word_Of_TM ) );
fwrite( &Word_Of_TM[ Word_Of_TM_Num ], sizeof( *Word_Of_TM ), 4, n_tm );

будет быстрее


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Adry
Дата 6.10.2011, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 13.4.2011

Репутация: нет
Всего: нет



Цитата(borisbn @  6.10.2011,  17:02 Найти цитируемый пост)
1. В документации по ф-ции fopen сказано
Цитата
Always check the return value to see if the pointer is NULL before performing any further operations on the file. 

А ты этого не делаешь. Плёхо!



Плёхо, конечно.
Просто не смогла придумать, что делать, если fopen(n_tm,"ab")==NULL.
Если continue или break - терять пакет. Если пытаться его открывать до упора, есть вероятность уйти в бесконечный цикл. Выбрасывать мессадж - не всегда оператор сидит рядом с установкой, а пока нет реакции на мессадж, программа простаивает. Оставила по принципу "я подумаю об этом завтра". Воот. А теперь этот корябус вылез...:((

По остальным пунктам - завтра на работе перерисую. Спасибо!!!
PM MAIL   Вверх
math64
Дата 6.10.2011, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



если уж на то пошло, более вероятна ошибка записи из-за отсутствия свободного места на диске.
Проверить на возможность открытия файла на (до)запись можно только после задания имени файла - потом он скорее всего так откроется (если не находится на флешке)
PM   Вверх
bsa
Дата 7.10.2011, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Adry @  6.10.2011,  16:56 Найти цитируемый пост)
А как? 

Вместо fopen/fread/fwrite/fclose использовать соответственно CreateFile/ReadFile/WriteFile/CloseHandle. Или аналог из MFC. Я так понял, именно он и используется в проекте.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0681 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.