Перейти к содержимому

Фотография

Текстовый файл


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 11

#1 Rumata

Rumata

    Новый участник

  • Members
  • Pip
  • 66 сообщений
  • Город:Астана

Отправлено 08 февраля 2008 - 03:01

Delphi script

Здравствуйте!

Столкнулся с такой проблемой: ассоциирую переменную с файлом
AssignFile( f, file_association );
Reset(f);


потом в скрипте у меня выполняются какие то действия по сценарию этого файла
но заморочка в том что у меня может в любой момент чтото отвалиться и файл не закрывается(использую CloseFile( f ); ), а нужно его отредактировать в реальном времени что нельзя сделать так как он заблокирован, приходиться перегружать TC

пробовал try-except, вызовы в критических кусках кода закрытия файла, но не получается отследитьвсе вариаты: либо возникает повторная ошибка закрытия либо файл блокируется

Подскажите как можно закрыть файл в людом случае при любых обстоятельствах.
А возможно ли запихать всё содержимое файла в переменную и работать с ней так же как и с файлом?
  • 0

#2 Tuchka_84

Tuchka_84

    Активный участник

  • Members
  • PipPip
  • 105 сообщений
  • ФИО:Маша

Отправлено 08 февраля 2008 - 06:06

можно записать все строки в массив(я делала так) и потом из массива вытаскивала по штуке.
PS (тоже встречалась с такой фигней что не освобождался файл и потом приходилось перегружать ТС - как избавиться на 100 % так не поняла)
  • 0

#3 Rumata

Rumata

    Новый участник

  • Members
  • Pip
  • 66 сообщений
  • Город:Астана

Отправлено 08 февраля 2008 - 06:47

можно записать все строки в массив(я делала так) и потом из массива вытаскивала по штуке.
PS (тоже встречалась с такой фигней что не освобождался файл и потом приходилось перегружать ТС - как избавиться на 100 % так не поняла)


классная идея спасибо!!!
счас вот реализую

Сначала перекидываю весь файл в двумерный массив а потом с ним работаю.

Если не я один с этим столкнулся выложу исходники может кому поможет
  • 0

#4 Rumata

Rumata

    Новый участник

  • Members
  • Pip
  • 66 сообщений
  • Город:Астана

Отправлено 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];

вообщем всё просто и сердито :)
  • 0

#5 Rumata

Rumata

    Новый участник

  • Members
  • Pip
  • 66 сообщений
  • Город:Астана

Отправлено 08 февраля 2008 - 09:11

ошибочка:
не
s := readln(f) ---> s := massiv[q+1];
а
readln(f,s) ---> s := massiv[q];
q:= q+1;


вот примерно так
  • 0

#6 Tuchka_84

Tuchka_84

    Активный участник

  • Members
  • PipPip
  • 105 сообщений
  • ФИО:Маша

Отправлено 08 февраля 2008 - 10:59

при работе с массивами очень полезные функции - BuiltIn.VarArrayRedim() и VarArrayHighBound(). Когда точно не известно заранее сколько будет элементов в массиве без них не обойтись
  • 0

#7 Rumata

Rumata

    Новый участник

  • Members
  • Pip
  • 66 сообщений
  • Город:Астана

Отправлено 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;

  • 0

#8 Tuchka_84

Tuchka_84

    Активный участник

  • Members
  • PipPip
  • 105 сообщений
  • ФИО:Маша

Отправлено 08 февраля 2008 - 12:21

readln(file,var) - наверно потому что может передавать только в переменную. возможно чтобы передавать сразу в массив у итема надо будет вызывать свойство Value. хотя хз.
насчет функций
1) Установка количества элементов в массиве
Builtin.VarArrayRedim(ArrayOfPath,HighBound); , где ArrayOfPath - массив HighBound - сколько хотите элементов чтобы в нем было. Т.е. если укажите большее число чем его размер ( к примеру размер был 3 а укажите 5) то он просто увеличится, а главное все элементы что в нем стояли НЕ сотрутся. Очень удобно увеличивать массив. При указании меньшего числа чем в нем было то эти последние элементы сотрутся, так кстати можно очистить массив :blush:
2)Получение количества элементов в массиве
Builtin.VarArrayHighBound(ArrayOfPath,1); где ArrayOfPath - массив 1 - с каким итератором считать. Нафиг это сделано не знаю Т.е. если ввести 2 то он посчитает через каждые 2 элемента т.е. половину всех элементов. А если 1 то посчитает все элементы.
  • 0

#9 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 08 февраля 2008 - 14:37

Здравствуйте.

Как вариант, можете использовать объект Scripting.FileSystemObject для работы с файлом. Мне кажется, при использовании этого объекта проблема с залоченным файлом при падении скрипта не должна появляться. Подробнее в разделе справки 'Working With Files From Scripts'.
  • 0
С уважением,
Дмитрий

#10 serpent

serpent

    Новый участник

  • Members
  • Pip
  • 33 сообщений

Отправлено 08 февраля 2008 - 20:53

2)Получение количества элементов в массиве
Builtin.VarArrayHighBound(ArrayOfPath,1); где ArrayOfPath - массив 1 - с каким итератором считать. Нафиг это сделано не знаю Т.е. если ввести 2 то он посчитает через каждые 2 элемента т.е. половину всех элементов. А если 1 то посчитает все элементы.

У Вас, видимо, какой-то другой тесткомплит. У меня эта функция получает не количество элементов, а значение верхней границы индекса (нижняя граница легко может быть не равна нулю). И второй параметр означает не "итератор", а границу какого измерения массива хотите получить (массив может быть многомерным, тесткомплит позволяет создавать еще двух- и трехмерные масивы: см. CreateVariantArray2, CreateVariantArray3).
  • 0

#11 Tuchka_84

Tuchka_84

    Активный участник

  • Members
  • PipPip
  • 105 сообщений
  • ФИО:Маша

Отправлено 11 февраля 2008 - 06:42

Для закрытия файла можно попробовать использовать Event на остановку теста OnStopTest(Sender) - выполняется всегда при окончании теста. Можно попробовать туда запихать закрытие файла. Тока фокус - надо будет делать имя файла глобальной переменной или разобраться как в это событие что-то передавать. Плюс у меня почему то OnStopTest() вызывается ровно столько же раз сколько я запускала тест - короче надо разбираться :blush: (это у меня в версии 6 стока вызывается в версии 5.13 все нормально работает. написала в супорт.жду ответа) .
  • 0

#12 Rumata

Rumata

    Новый участник

  • Members
  • Pip
  • 66 сообщений
  • Город:Астана

Отправлено 12 февраля 2008 - 05:15

С массивом всё работает как швейцарские часы! :dirol:

+ то что можно получить доступ к любой строке файла быстро и без проблем
большой + то что(ведь в TC нельзя открыть одновременно больше одного файла одновременно, по крайней мере в версии 5.12.454), можно одновременно обрабатывать кучу файлов на приличной скорости
  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных