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

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

Заранее спасибо за помощь.
...
Рейтинг: 0 / 0
04.04.2005, 13:09
    #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
04.04.2005, 15:43
    #32996610
5631
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
восстановление таблиц
Ничего не поможет. Таблицы портятся во время работы.
Самый радикальный способ- вообще их не открывать, а использовать другие
инструменты.
...
Рейтинг: 0 / 0
06.04.2005, 01:16
    #32999240
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
восстановление таблиц
Hi 5631!

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

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

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

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

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

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


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