Главная страница
    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.036 c
1-1088398293
X-Men
2004-06-28 08:51
2004.07.11
Как получить указатель на функцию?


3-1086887593
ceval
2004-06-10 21:13
2004.07.11
Подскажите как вывести в DBGrid следующие:


6-1084383557
Dimaxx
2004-05-12 21:39
2004.07.11
Исходники для работы с Р2Р


14-1087904308
}|{yk
2004-06-22 15:38
2004.07.11
Лицензионные музыкальные CD


3-1087129292
AlexG
2004-06-13 16:21
2004.07.11
Использование результата сохраненной процедуры.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский