Форум: "Основная";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
ВнизКак определить, является файл бинарным или текстовым? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.036 c