Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как определить, является файл бинарным или текстовым? [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]

да


Наверх

Титульная страница Поиск, карта сайта Написать письмо