Текстовый файл
#1
Отправлено 08 февраля 2008 - 03:01
Здравствуйте!
Столкнулся с такой проблемой: ассоциирую переменную с файлом
AssignFile( f, file_association );
Reset(f);
потом в скрипте у меня выполняются какие то действия по сценарию этого файла
но заморочка в том что у меня может в любой момент чтото отвалиться и файл не закрывается(использую CloseFile( f ); ), а нужно его отредактировать в реальном времени что нельзя сделать так как он заблокирован, приходиться перегружать TC
пробовал try-except, вызовы в критических кусках кода закрытия файла, но не получается отследитьвсе вариаты: либо возникает повторная ошибка закрытия либо файл блокируется
Подскажите как можно закрыть файл в людом случае при любых обстоятельствах.
А возможно ли запихать всё содержимое файла в переменную и работать с ней так же как и с файлом?
#2
Отправлено 08 февраля 2008 - 06:06
PS (тоже встречалась с такой фигней что не освобождался файл и потом приходилось перегружать ТС - как избавиться на 100 % так не поняла)
#3
Отправлено 08 февраля 2008 - 06:47
можно записать все строки в массив(я делала так) и потом из массива вытаскивала по штуке.
PS (тоже встречалась с такой фигней что не освобождался файл и потом приходилось перегружать ТС - как избавиться на 100 % так не поняла)
классная идея спасибо!!!
счас вот реализую
Сначала перекидываю весь файл в двумерный массив а потом с ним работаю.
Если не я один с этим столкнулся выложу исходники может кому поможет
#4
Отправлено 08 февраля 2008 - 08:50
можно записать все строки в массив(я делала так) и потом из массива вытаскивала по штуке.
PS (тоже встречалась с такой фигней что не освобождался файл и потом приходилось перегружать ТС - как избавиться на 100 % так не поняла)
классная идея спасибо!!!
счас вот реализую
Сначала перекидываю весь файл в двумерный массив а потом с ним работаю.
Если не я один с этим столкнулся выложу исходники может кому поможет
вот процедура которя пишет в массив
procedure From_file_in_file(file_ : elevariant);
var
fff; // файловая переменная
ks : integer; // количество строк в файле
ks_i : integer; // счётчик
str_f;
begin
if debug then
log.message('DEBUG: Начало процедуры перенесения файла в массив');
if not(fileexists(file_)) then
begin
Fatal_Error('Невозможно найти файл сценария: ',file_);
end;
AssignFile( fff, file_ );
Reset(fff);
// нужно определить размерность массивa
if debug then
log.message('DEBUG: Определяю размерность массива');
ks := 0;
while not(eof(fff)) do
begin
readln(fff,str_f);
ks := ks + 1;
end;
closefile(fff);
Reset(fff);
// создаю массив необходимой размерности
m_file := BuiltIn.CreateVariantArray(1, ks);
//заполняю массив
for ks_i := 1 to ks do
readln(fff,m_file[ks_i]);
closefile(fff);
if debug then
log.message('DEBUG: размерность массива: '+ inttostr(ks));
end;
в коде нужно сделать определ глоб переменную непример q
a потом заменить или делать по аналогии
reset(f) ---> q:=1
s := read(f) ---> s := massiv[q];
s := readln(f) ---> s := massiv[q+1];
вообщем всё просто и сердито :)
#5
Отправлено 08 февраля 2008 - 09:11
не
s := readln(f) ---> s := massiv[q+1];
а
readln(f,s) ---> s := massiv[q];
q:= q+1;
вот примерно так
#6
Отправлено 08 февраля 2008 - 10:59
#7
Отправлено 08 февраля 2008 - 11:27
при работе с массивами очень полезные функции - BuiltIn.VarArrayRedim() и VarArrayHighBound(). Когда точно не известно заранее сколько будет элементов в массиве без них не обойтись
А можно поподробнее насчёт этих функций?
кстати, почему не работает
for ks_i := 1 to ks do
readln(fff,m_file[ks_i]);
приходиться в массив писать через дополнительную строковую переменную
for ks_i := 1 to ks do
begin
readln(fff,qwer);
m_file[ks_i] := qwer;
end;
#8
Отправлено 08 февраля 2008 - 12:21
насчет функций
1) Установка количества элементов в массиве
Builtin.VarArrayRedim(ArrayOfPath,HighBound); , где ArrayOfPath - массив HighBound - сколько хотите элементов чтобы в нем было. Т.е. если укажите большее число чем его размер ( к примеру размер был 3 а укажите 5) то он просто увеличится, а главное все элементы что в нем стояли НЕ сотрутся. Очень удобно увеличивать массив. При указании меньшего числа чем в нем было то эти последние элементы сотрутся, так кстати можно очистить массив
2)Получение количества элементов в массиве
Builtin.VarArrayHighBound(ArrayOfPath,1); где ArrayOfPath - массив 1 - с каким итератором считать. Нафиг это сделано не знаю Т.е. если ввести 2 то он посчитает через каждые 2 элемента т.е. половину всех элементов. А если 1 то посчитает все элементы.
#9
Отправлено 08 февраля 2008 - 14:37
Как вариант, можете использовать объект Scripting.FileSystemObject для работы с файлом. Мне кажется, при использовании этого объекта проблема с залоченным файлом при падении скрипта не должна появляться. Подробнее в разделе справки 'Working With Files From Scripts'.
Дмитрий
#10
Отправлено 08 февраля 2008 - 20:53
У Вас, видимо, какой-то другой тесткомплит. У меня эта функция получает не количество элементов, а значение верхней границы индекса (нижняя граница легко может быть не равна нулю). И второй параметр означает не "итератор", а границу какого измерения массива хотите получить (массив может быть многомерным, тесткомплит позволяет создавать еще двух- и трехмерные масивы: см. CreateVariantArray2, CreateVariantArray3).2)Получение количества элементов в массиве
Builtin.VarArrayHighBound(ArrayOfPath,1); где ArrayOfPath - массив 1 - с каким итератором считать. Нафиг это сделано не знаю Т.е. если ввести 2 то он посчитает через каждые 2 элемента т.е. половину всех элементов. А если 1 то посчитает все элементы.
#11
Отправлено 11 февраля 2008 - 06:42
#12
Отправлено 12 февраля 2008 - 05:15
+ то что можно получить доступ к любой строке файла быстро и без проблем
большой + то что(ведь в TC нельзя открыть одновременно больше одного файла одновременно, по крайней мере в версии 5.12.454), можно одновременно обрабатывать кучу файлов на приличной скорости
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных