![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как определить, является файл бинарным или текстовым? [D7, WinXP]
Aleksandr. © (2004-06-24 14:07:00)Сделал служебную смотрелку для наших бинарных файлов, и тут вырисовалась проблема: смотрелку ассоциируешь на определенную маску расширений, и если по случайности пытаешься делать просмотр текстового файла с расширением, попадающим под маску, то это приводит к самым печальным результатам с памятью системы (считывается integer количества элементов в массиве, затем в соответствии с ним сами элементы). Как можно определить, что открываемый файл является текстовым, только проверкой наличия символов, не входящих в набор всяких там 'A'..'Z'?
Aleksandr. (2004-06-24 15:24:00) [1]Anatoly Podgoretsky © :
Спасибо за участие
Anatoly Podgoretsky (2004-06-24 15:20:00) [2]Aleksandr. (24.06.04 15:07) [12]
Ты уж постарайся
GuAV (2004-06-24 15:17:00) [3]
> Увы, а где гарантия, что в текстовом файле начало не совпадет?
Нигде, но можно написать например сигнатуру, содержащую #3, #7, #11, и другие которые крайне редко бывают в текстовиках.
Sandman25 (2004-06-24 15:13:00) [4][14] Aleksandr. (24.06.04 15:10)
Ошибка может быть и в последнем байте.
Aleksandr. (2004-06-24 15:10:00) [5]Ладно, все понятно, будем писать проверку... Интересно, скольких байт будет достаточно из всего файла, чтобы быть уверенным, что это текст %(
Sandman25 (2004-06-24 15:09:00) [6]>сначала Count, который случайным образом может оказаться с эдак с миллион
Я так понял, что [7] Вы так и не прочитали...
Aleksandr. (2004-06-24 15:07:00) [7]Reindeer Moss Eater © :
Связь очень простая: по маске с таким файлом-хранилищем коллекции может совпасть только наш же служебный текстовый файл. А теперь представьте, как смотрелка пытается этот файл прочесть - считывая сначала Count, который случайным образом может оказаться с эдак с миллион, смотря какой текст, а затем миллион раз пытается прочесть оттуда свои элементы.
Плохиш © :
Увы, а где гарантия, что в текстовом файле начало не совпадет?
Плохиш (2004-06-24 14:55:00) [8]>Aleksandr. (24.06.04 14:48) [8]
Так запиши в начало файла свою любимую сигнатуру и проверяй её.
А файлы, они все бинарные ;-)
Reindeer Moss Eater (2004-06-24 14:51:00) [9]Ну и какая связь между какими-то списками элементов неупомянутыми в вопросе и бинарными текстовыми файлами ?
Aleksandr. (2004-06-24 14:50:00) [10]Гы, промахнулся с зюковкой:
Add(TNItem.Load(S))
Aleksandr. (2004-06-24 14:48:00) [11]Reindeer Moss Eater © :
Ну, если для Вас работа с чтением/записью в потоки списков и коллекций кажется бредом, объясню: Список записывает в поток Count своих элементов, затем Count количество раз вызывает метод сохранения в этот же поток своих элементов-объектов. Соответственно, в том же порядке происходит чтение:
S.Read(i,SizeOf(i));
for j:=0 to i-1 do
Add(TNItem.Load(F))
где TNItem.Load - констрактор объекта-элемента коллекции:
constructor TNItem.Load(S : TStream);
begin
S.Read(Param1,SizeOf(Param1))
S.Read(Param2,SizeOf(Param2))
...
end;
Sandman25 (2004-06-24 14:36:00) [12]>Просто программа честно пытается взять у системы ресурсы под тот объем данных, который ей был указан
Все это можно проверить.
Например, если размер превышает 1.000.000.000, то ругаться. Или если был указан размер 1000, а данных (через размер файла легко расчитать даже без непосредственной загрузки) всего 10.
Reindeer Moss Eater (2004-06-24 14:36:00) [13]Бред какой-то
Reindeer Moss Eater (2004-06-24 14:35:00) [14](считывается integer количества элементов в массиве, затем в соответствии с ним сами элементы). Как можно определить, что открываемый файл является текстовым,
Откуда считывается?
Где "сами элемнты" и что это такое?
Почему текстовый файл мешает работе программы?
Aleksandr. (2004-06-24 14:33:00) [15]Sandman25 © : Так при чем тут отказоустойчивость? Никакой ошибки-то не происходит. Просто программа честно пытается взять у системы ресурсы под тот объем данных, который ей был указан. Тут было бы вернее, может, в цикле чтения элементов от 0 до прочитанного Count-1 сделать проверку на конец файла и прекращать чтение, но ведь несовпадение конца файла с указанным количеством как раз надо как ошибку делегировать?
Sandman25 (2004-06-24 14:09:00) [16]Может, лучше переписать программу, сделав ее отказоустойчивой? Ну там try-except-finally всякие...
Тимохов (2004-06-24 14:09:00) [17]гарантировано никак.
не гарантировано - примерно так как вы сказали.
плюс переводы строк.
Reindeer Moss Eater (2004-06-24 14:08:00) [18]да