powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / восстановление таблиц
6 сообщений из 6, страница 1 из 1
восстановление таблиц
    #32996109
lezah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем известно, что foxpro обожает ломать dbf-таблицы. Можно ли как нибудь средствами самого же foxpro проверить, повреждена ли таблица или нет, а еще лучше, если не просто проверить, а восстановить?

На счет существования утилит для восстановления таблиц я знаю, но мне нужно сделать это средствами foxpro.

Заранее спасибо за помощь.
...
Рейтинг: 0 / 0
восстановление таблиц
    #32996198
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно - структура DBF файла и его заголовка описана в Хелпе и достаточно проста. Функций для работы с файлами на низком уровне хватает - так что флаг в руку - пиши;)
Вот например исправление неправельного счетчика количества записей (любимая ошибка при внезапном выключении машины)
Код: 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.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
FUNCTION NOT_DBF
PARAMETERS file_name

*   Размер файла
=ADir(a_file, file_name)
file_size=a_file( 1 , 2 )

*   Множетели для перевода
DIMENSION a_mult( 4 ), a_byte( 4 )
a_mult( 1 )= 1 
a_mult( 2 )= 256 
a_mult( 3 )= 65536 
a_mult( 4 )= 16777216 
a_byte= 0 

file_hand=FOpen(file_name, 2 )

*   Невозможно открыть файл
IF file_hand = - 1 
   RETURN TO opendbf .f.
ELSE
*   Пустой файл
   =FSeek(file_hand,  0 ,  0 )
   IF FEOF(file_hand)
      IF .not.FClose(file_hand)
         CLOSE ALL
      ENDIF
      RETURN TO opendbf .f.
   ELSE
*   Не DBF-фовский файл
      m_byte=FRead(file_hand, 1 )
      IF m_byte <> Chr( 3 ).and.;
         m_byte <> Chr( 131 ).and.;
         m_byte <> Chr( 139 ).and.;
         m_byte <> Chr( 245 )
         IF .not.FClose(file_hand)
            CLOSE ALL
         ENDIF
         RETURN TO opendbf .f.
      ELSE
*   Перевод в десятичные числа количества записей
         m_count= 0 
         FOR i= 0  TO  3 
            =FSeek(file_hand,  4 +i,  0 )
            m_byte=FRead(file_hand,  1 )
            m_count=m_count+ASC(m_byte)*a_mult(i+ 1 )
         ENDFOR
         
*   Перевод в десятичные числа длинны заголовка
         m_hand= 0 
         FOR i= 0  TO  1 
            =FSeek(file_hand,  8 +i,  0 )
            m_byte=FRead(file_hand,  1 )
            m_hand=m_hand+ASC(m_byte)*a_mult(i+ 1 )
         ENDFOR
         
*   Перевод в десятичные числа длинны записи
         m_size= 0 
         FOR i= 0  TO  1 
            =FSeek(file_hand,  10 +i,  0 )
            m_byte=FRead(file_hand,  1 )
            m_size=m_size+ASC(m_byte)*a_mult(i+ 1 )
         ENDFOR
         
*   Размер файла
         m_file_size=m_count*m_size+m_hand+ 1 
         
         IF file_size <> m_file_size
*   Реальная и расчетная длинна файлов не совпадает
            IF file_size > m_file_size
*   Если расчетная длина больше расчетной то файл усекаем            
               =FChSize(file_hand, m_file_size)
            ELSE
*   Если расчетная больше, то корректируем заголовок
               IF Mod(file_size-(m_hand+ 1 ), m_size) =  0 
*   Если нет в конце лишних байт, то просто в заголовке уменьшаем
*   число записей
                  m_new_count=(file_size-(m_hand+ 1 ))/m_size
                  
*   Перевод числа записей в шестнадцатиричные
                  IF m_new_count >= a_mult( 4 )
                     a_byte( 4 )=Int(m_new_count/a_mult( 4 ))
                     m_new_count=Mod(m_new_count, a_mult( 4 ))
                  ENDIF
                  IF m_new_count >= a_mult( 3 )
                     a_byte( 3 )=Int(m_new_count/a_mult( 3 ))
                     m_new_count=Mod(m_new_count, a_mult( 3 ))
                  ENDIF
                  IF m_new_count >= a_mult( 2 )
                     a_byte( 2 )=Int(m_new_count/a_mult( 2 ))
                     m_new_count=Mod(m_new_count, a_mult( 2 ))
                  ENDIF
                  a_byte( 1 )=m_new_count
                  
*   Запись в файл
                  FOR i= 0  TO  3 
                     m_byte=Chr(a_byte(i+ 1 ))
                     =FSeek(file_hand,  4 +i,  0 )
                     =FWrite(file_hand, m_byte,  1 )
                  ENDFOR
               ELSE
*   Определяем число лишних байт и усекаем файл
                  m_diff=Mod(file_size-(m_hand+ 1 ), m_size)
                  =FChSize(file_hand, file_size-m_diff)
                  
*   Уменьшаем в заголовке число записей
                  m_new_count=(file_size-m_diff-(m_hand+ 1 ))/m_size
                  
*   Перевод числа записей в шестнадцатиричные
                  IF m_new_count >= a_mult( 4 )
                     a_byte( 4 )=Int(m_new_count/a_mult( 4 ))
                     m_new_count=Mod(m_new_count, a_mult( 4 ))
                  ENDIF
                  IF m_new_count >= a_mult( 3 )
                     a_byte( 3 )=Int(m_new_count/a_mult( 3 ))
                     m_new_count=Mod(m_new_count, a_mult( 3 ))
                  ENDIF
                  IF m_new_count >= a_mult( 2 )
                     a_byte( 2 )=Int(m_new_count/a_mult( 2 ))
                     m_new_count=Mod(m_new_count, a_mult( 2 ))
                  ENDIF
                  a_byte( 1 )=m_new_count
                  
*   Запись в файл
                  FOR i= 0  TO  3 
                     m_byte=Chr(a_byte(i+ 1 ))
                     =FSeek(file_hand,  4 +i,  0 )
                     =FWrite(file_hand, m_byte,  1 )
                  ENDFOR
               ENDIF
            ENDIF
         ELSE
*   Файл невозможно исправить
            RETURN TO opendbf .f.
         ENDIF
         
         IF .not.FClose(file_hand)
            CLOSE ALL
         ENDIF
      ENDIF
   ENDIF
ENDIF
RETURN .t.
Написана правда давно, еще для FPD. Сейчас для перевода из различных систем вроде есть стандартные средства
...
Рейтинг: 0 / 0
восстановление таблиц
    #32996610
5631
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего не поможет. Таблицы портятся во время работы.
Самый радикальный способ- вообще их не открывать, а использовать другие
инструменты.
...
Рейтинг: 0 / 0
восстановление таблиц
    #32999240
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi 5631!

У меня не портятся, расскажи что я неправильно делаю?

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
восстановление таблиц
    #32999532
5631
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-P.S. Причины порчи базы те-же что и для обычных таблиц (т.к. по сути это и
есть обычная таблица) - и фокс при этом совершенно не при делах - это
проблемы гнилых сетей, сбойного железа, сбоев питания и т.п.

P.P.S. Не устаю повторять - "Важнейшим из искусств для нас является Backup".

Igor Korolyov
...
Рейтинг: 0 / 0
восстановление таблиц
    #33001700
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi 5631!

И шо? Это говорит лишь о том, что я по возможности не пользую всякую бяку для работы, а от сбоев питания (что тоже МОЖНО решить с помошью UPS-ов), и от ситуаций "хата сгорела/молния в комп попала/землетрясение/наводнение/цунами/террористы дом взорвали" поможет Backup - конечно если сам живой остался :)

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / восстановление таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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