powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблема с доступом к файлу.
7 сообщений из 7, страница 1 из 1
Проблема с доступом к файлу.
    #32454372
alex-ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
Есть расширенная процедура, которая берет файлы, обрабатывает их, создавая конечный файл и результаты загружает в БД.
ИНОГДА Проблема возникает при попытке загрузить конечный файл в БД (через bcp), т.к. результирующий файл остается занятым каким-то процессом (Да и программа определяет что в такие моменты длина файла = 0, но если немного подождать (0.5-1.5 сек) то все становится так как надо: длина > 0).
Так что получается, что fclose(...) которым я закрываю конечный файл, отрабатывает , а файл тем неменее остается открытым?
Есть ли какие-нить способы проверять это, кроме того, которым пользуюсь я?.
Заранее спасибо.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
void mainFunc()
{
  static const char * DestFileName =  "itog.txt" ; 
  ....
  prepare(SourceFileName, DestFileName); // Создаем конечный файл.
  if ( FileLen(DestFileName) )           // Проверяем длину созданного файла, если >  0  то грузим в БД.
  {
    ...
    ... BULKCOPY ...
    ...
  }
  ....
}
// ------------------------------------------------------
 
void prepare(char * SourceFileName, char * DestFileName)
{
 rf = fopen( SourceFileName,  "rt"  ); // Исходный файл
 if( rf )
 {
   wf = fopen( DestFileName,  "wt"  ); // Конечный файл
   if( wf )
   {
      ......
      ......
      fprintf(wf,  "..." , ...);
   }
   if ( fclose(wf) ) // Закрываем файл. (Всегда отрабатывает нормально).
   { // Сообщение об ошибке закрытия. 
     ...
   }
 }
 fclose(rf);
}
// ------------------------------------------------------
 
long FileLen(char * DestFileName)
{
 struct _finddata_t f; 
 long lngFileLen = - 1 ;
 char LoopMsg[ 256 ];

 long hfLen = _findfirst( szFileName, &f );	
 if( hfLen != - 1  )
 {
  if ( f.size ==  0  )
  // Если размер файла =  0 ,
  // то я пытаюсь проверить а может быть это из-за того, что по каким-то причинам не закрылся поток записи в файл.
  // Для этого закрываю-переотрываю поиск файла в цикле и проверяю при этом его длину (если >  0  значит все ОК).
  // Обычно результат (размер файла становится >  0 ) я получаю шагах с  7000  по  11000 .
  {
    while ((f.size ==  0 ) && (cntLoop <  100000 ) )
    {
      _findclose(hfLen);
      hfLen = _findfirst( szFileName, &f );	
      if (f.size >  0 )
      {
        sprintf(LoopMsg,  "Net send Try to reopen the file given the result on step : %i" , cntLoop);
        WinExec((LPCSTR)LoopMsg, SW_HIDE);
        break;
      }
      cntLoop++;
    }
  }
 lngFileLen = f.size;
 _findclose(hFlen);
 
 return lngFileLen;
}
...
Рейтинг: 0 / 0
Проблема с доступом к файлу.
    #32454395
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перед fclose попробуй fflush сказать
...
Рейтинг: 0 / 0
Проблема с доступом к файлу.
    #32454610
alex-ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А Вы уверены что это поможет?
может дело в чем-то другом?

The fclose function closes stream. All buffers associated with the stream are flushed prior to closing. System-allocated buffers are released when the stream is closed. Buffers assigned by the user with setbuf and setvbuf are not automatically released.
...
Рейтинг: 0 / 0
Проблема с доступом к файлу.
    #32454779
alex-ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется что я нашел способ решить эту проблему:
мне нужно вообще запретить буферизацию при записи в файл.
Код: plaintext
setvbuf( wf, NULL, _IONBF,  0  );

int setvbuf( FILE *stream, char *buffer, int mode, size_t size );

Осталось только протестировать в "боевом" варианте а на это может уйти несколько дней т.к. ошибка встречается довольно-таки редко.
Всем спасибо.
...
Рейтинг: 0 / 0
Проблема с доступом к файлу.
    #32455989
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну дык, если запись идёт часто, буфер будет загружен и может запросто не успевать за программой, можно на всякий случай сделать

while (ошибка_записи_в_файл)
{
Sleep(100);
Пишем_в_файл();
}
fflush может не помочь, так как скорее всего автоматом зовётся при fclose. fflush бывает полезен, когда файл долго открыт и постоянно ведётся запись(чтобы видеть, ведётся она на самом деле или нет).
...
Рейтинг: 0 / 0
Проблема с доступом к файлу.
    #32456138
alex-ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> while (ошибка_записи_в_файл)
Так вся фигня в том, что fprintf то нормально отрабатывает и никаких ошибок не выдает.
А насчет Sleep() это идея!
Я её засуну в свой цикл переоткрытия файла чтоб ресурсы системы особо не отъедать.

Да, кстати, setvbuf() не очень то помог: правда проблем с проверкой размера файла не было но при BULKCOPY почему-то возникла ошибка. Так что в результате я вернулся к своему первоначальному варианту проги.
...
Рейтинг: 0 / 0
Проблема с доступом к файлу.
    #32456713
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТак вся фигня в том, что fprintf то нормально отрабатывает и никаких ошибок не выдает.
Сорри, я нагнял.

Не ошибка_записи_в_файл, а ошибка_доступа_к_файлу. Тобишь, пока система его записать не успела полность, получить данные о файле или содержимом не получится. 100% работает - отрыть файл на редактирование.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблема с доступом к файлу.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]