Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.112 c
3-1086872237
Valeri
2004-06-10 16:57
2004.07.11
Поиск....


6-1084691581
FireMan_Alexey
2004-05-16 11:13
2004.07.11
Проблема с RecvFrom


14-1088082641
RealRascal
2004-06-24 17:10
2004.07.11
Кто знает английский?


3-1087039239
Uran
2004-06-12 15:20
2004.07.11
Хранимая процедура и BLOB


1-1088509098
P@vel
2004-06-29 15:38
2004.07.11
Procedures $ Functions





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский