Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.11;
Скачать: CL | DM;

Вниз

Как определить, является файл бинарным или текстовым?   Найти похожие ветки 

 
Aleksandr.   (2004-06-24 14:07) [0]

Сделал служебную смотрелку для наших бинарных файлов, и тут вырисовалась проблема: смотрелку ассоциируешь на определенную маску расширений, и если по случайности пытаешься делать просмотр текстового файла с расширением, попадающим под маску, то это приводит к самым печальным результатам с памятью системы (считывается integer количества элементов в массиве, затем в соответствии с ним сами элементы). Как можно определить, что открываемый файл является текстовым, только проверкой наличия символов, не входящих в набор всяких там "A".."Z"?


 
Reindeer Moss Eater ©   (2004-06-24 14:08) [1]

да


 
Тимохов ©   (2004-06-24 14:09) [2]

гарантировано никак.
не гарантировано - примерно так как вы сказали.
плюс переводы строк.


 
Sandman25 ©   (2004-06-24 14:09) [3]

Может, лучше переписать программу, сделав ее отказоустойчивой? Ну там try-except-finally всякие...


 
Aleksandr.   (2004-06-24 14:33) [4]

Sandman25 © : Так при чем тут отказоустойчивость? Никакой ошибки-то не происходит. Просто программа честно пытается взять у системы ресурсы под тот объем данных, который ей был указан. Тут было бы вернее, может, в цикле чтения элементов от 0 до прочитанного Count-1 сделать проверку на конец файла и прекращать чтение, но ведь несовпадение конца файла с указанным количеством как раз надо как ошибку делегировать?


 
Reindeer Moss Eater ©   (2004-06-24 14:35) [5]

(считывается integer количества элементов в массиве, затем в соответствии с ним сами элементы). Как можно определить, что открываемый файл является текстовым,

Откуда считывается?
Где "сами элемнты" и что это такое?
Почему текстовый файл мешает работе программы?


 
Reindeer Moss Eater ©   (2004-06-24 14:36) [6]

Бред какой-то


 
Sandman25 ©   (2004-06-24 14:36) [7]

>Просто программа честно пытается взять у системы ресурсы под тот объем данных, который ей был указан

Все это можно проверить.
Например, если размер превышает 1.000.000.000, то ругаться. Или если был указан размер 1000, а данных (через размер файла легко расчитать даже без непосредственной загрузки) всего 10.


 
Aleksandr.   (2004-06-24 14:48) [8]

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;


 
Aleksandr.   (2004-06-24 14:50) [9]

Гы, промахнулся с зюковкой:
Add(TNItem.Load(S))


 
Reindeer Moss Eater ©   (2004-06-24 14:51) [10]

Ну и какая связь между какими-то списками элементов неупомянутыми в вопросе и бинарными текстовыми файлами ?


 
Плохиш ©   (2004-06-24 14:55) [11]

>Aleksandr.   (24.06.04 14:48) [8]

Так запиши в начало файла свою любимую сигнатуру и проверяй её.
А файлы, они все бинарные ;-)


 
Aleksandr.   (2004-06-24 15:07) [12]

Reindeer Moss Eater ©  :
Связь очень простая: по маске с таким файлом-хранилищем коллекции может совпасть только наш же служебный текстовый файл. А теперь представьте, как смотрелка пытается этот файл прочесть - считывая сначала Count, который случайным образом может оказаться с эдак с миллион, смотря какой текст, а затем миллион раз пытается прочесть оттуда свои элементы.

Плохиш © :
Увы, а где гарантия, что в текстовом файле начало не совпадет?


 
Sandman25 ©   (2004-06-24 15:09) [13]

>сначала Count, который случайным образом может оказаться с эдак с миллион

Я так понял, что [7] Вы так и не прочитали...


 
Aleksandr.   (2004-06-24 15:10) [14]

Ладно, все понятно, будем писать проверку... Интересно, скольких байт будет достаточно из всего файла, чтобы быть уверенным, что это текст %(


 
Sandman25 ©   (2004-06-24 15:13) [15]

[14] Aleksandr.   (24.06.04 15:10)

Ошибка может быть и в последнем байте.


 
GuAV ©   (2004-06-24 15:17) [16]


> Увы, а где гарантия, что в текстовом файле начало не совпадет?

Нигде, но можно написать например сигнатуру, содержащую  #3, #7, #11, и другие которые крайне редко бывают в текстовиках.


 
Anatoly Podgoretsky ©   (2004-06-24 15:20) [17]

Aleksandr.   (24.06.04 15:07) [12]
Ты уж постарайся


 
Aleksandr.   (2004-06-24 15:24) [18]

Anatoly Podgoretsky ©  :
Спасибо за участие



Страницы: 1 вся ветка

Текущий архив: 2004.07.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.045 c
4-1085663755
sesh
2004-05-27 17:15
2004.07.11
запуск программы как сервиса


3-1086879429
Subdigger
2004-06-10 18:57
2004.07.11
dbms_output


4-1085675375
Nomolos
2004-05-27 20:29
2004.07.11
Как убрать рамку окна?


3-1086854322
r9000
2004-06-10 11:58
2004.07.11
Зависание программы при редактировании таблицы базы


1-1088247574
Lexa
2004-06-26 14:59
2004.07.11
Подскажите плиз как добавить приложение в автозапуск.