Показать сообщение отдельно
  #8  
Старый 23.11.2013, 13:50
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от kti
Все! разобрался сам. Достаточно было почитать про файловые потоки..
Ага. Справка великая сила
Хотя изучение исходников, наверное, ещё большая сила.

Цитата:
Сообщение от kti
Остался один вопросик, что делает конструкция:

Код:
FS.create(FileName, fmCreate or fmOpenWrite)

т.е. если файл существует, то открывает для чтения/записи, а если нет то создает?
Если это так, то это то, что мне нужно
Во-первых нужно создавать объект не от переменной, а от класса (т.е. TFileStream.Create, а не FS.Create).
Во-вторых в Delphi7 нельзя с флагом fmCreate использовать никакие другие флаги (в новых версиях Delphi вроде это поправили), но фактически эффект будет таким будто с флагом fmCreate был использован флаг fmOpenReadWrite.

Цитата:
Сообщение от kti
Еще вопросик
Как мне узнать (при чтении потока) что файл кончился?
И вообще как правильно обрабатывать ошибки чтения из потока?
.....
например размер блока 2000 байт, а реально в файле 1000 байт.
ReadBuffer вызовет исключение? как его обрабатывать?
Во-первых у потока есть свойства Size (общий размер потока) и Position (текущая позиция чтения/записи). Если значение Size совпадает с Position - значит мы в конце файла.
Во-вторых метод ReadBuffer используется как правило для гарантированного чтения указанного количества байт. Например мы читаем некоторый конкретный формат файла и судя по спецификации считаем что далее можем прочитать определённое количество байт, а оказывается что их прочиталось меньше, из-за чего ReadBuffer вызовет исключение, что для нас будет означать что либо неверный формат файла или файл повреждён (недокачан). Ну а исключения обрабатываются через конструкцию "try..except"
Если же нужно читать не гарантированное количество байт, а "сколько получится" - нужно вместо ReadBuffer использовать просто Read. Разница в том, что Read не вызовет исключения если прочиталось меньше байт чем указано и кроме того Read вернёт в результате сколько реально прочиталось байт, т.е. если мы пытались прочитать больше нуля байт, а Read вернула ноль, то значит мы уже в конце файла и читать из него больше нечего.
Ответить с цитированием