более правильный вариант
Код:
I := Length(St);
BlockWrite(F, I, SizeOf(I));
BlockWrite(F, St[1], Length(St)*SizeOf(St[1]));
И соответственно
Код:
BlockRead(F,I,SizeOf(I));
UniqueString(S);
SetLength(S,I);
BlockRead(F,S[1], Length(St)*SizeOf(St[1]));
Вариант с BlockRead(F,S, Length(St)) работал, потому что запись и чтение делалось в одной процедуре, а на самом деле писалось не то и читалось не туда(посмотрите что на самом деле записано в файл). Но поскольку писалось и читалось по одному и тому же адресу, то ошибка была не видна.