Форум: "Начинающим";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];
ВнизДважды открыть файл (RW и R режимы). Найти похожие ветки
← →
Alexey (AZ) (2007-04-01 18:41) [0]Здравствуйте.
Возникла небольшая заминка по поводу совместного использования доступа. Открываю файл ч/з :
TFileStream.Create(DBName,fmOpenReadWrite,fmShareDenyRead);
Так файл пишется, а затем его же из этого же приложения надо быстро читать и поэтому использую TMemoryStream.LoadFromFile, но делфи страшно ругается. Сейчас поясню зачем так. Нужно постепенно записывать в файл понемногу ч/з определенные промежутки времени, а затем быстро переиндексировать содержимое, тоже в опр. моменты времени, но не синхронно, т.е. в одном потоке. Соответственно, ничего лучше чем загрузить разом в MemoryStream и по-быстрому перечитать там его, я не придумал.
Предложите плз человеческие методы. В несколько строк желательно, дабы без извратов. BDS2006, TurboDelphi. Кстати, справка в нем - гуано.
← →
Anatoly Podgoretsky © (2007-04-01 18:43) [1]> Alexey (AZ) (01.04.2007 18:41:00) [0]
Ты сам запретил его читать - fmShareDenyRead
← →
Alexey (AZ) (2007-04-01 18:51) [2]Извините, просто ошибся. Конечно же fmShareDenyWrite там должно быть. результат тот же =( Ошибки доступа.
← →
Alexey (AZ) (2007-04-01 18:58) [3]GetLastError сообщает ERROR_SHARING_VIOLATIONS =(
← →
Desdechado © (2007-04-01 19:08) [4]> тоже в опр. моменты времени, но не синхронно, т.е. в одном потоке.
Закрываешь первый, открываешь второй.
Хотя для fmOpenReadWrite это не нужно. Можешь прямо в нем опять перечитывать и "индексировать".
← →
Anatoly Podgoretsky © (2007-04-01 19:14) [5]
> GetLastError сообщает ERROR_SHARING_VIOLATIONS =(
Значит открывается в режиме чтения/записи, если вообще не монопольно.
← →
Alexey (AZ) (2007-04-01 19:16) [6]Дело в том, что затребовать этот файл из одного потока могут разные объекты - один будет только записывать, другой - только читать. Причем, эти объекты ничего не знают о существовании друг друга. А открывать для объекта1 и закрывать, а затем открывать для объекта2 и закрывать* и так в цикле по 100 раз на секунду, это не эффективно.
*Т.е. объект1 всегда _держит_ файл открытым и пишет, а объект 2 мгновенно считывает (т.к. унаследован от TMemoryStream) и соответственно _не_держит_ файл.
← →
Alexey (AZ) (2007-04-01 19:18) [7]
> Anatoly Podgoretsky © (01.04.07 19:14) [5]
К сожалению отладка подтверждает, что:
Access = GENERIC_READ|GENERIC_WRITE
ShareMode = FILE_SHARE_READ
Mode = OPEN_EXISTING
← →
Desdechado © (2007-04-01 21:55) [8]> но не синхронно, т.е. в одном потоке.
> всегда _держит_ файл открытым и пишет,
Где правда?
Эти 2 мысли противоречат друг другу.
← →
Alexey (AZ) (2007-04-02 14:29) [9]Нет. Вот так:
for ... do begin
Обект1-> пишет.
Объект2->читает.
end;
Каждый объект держит свой файл. Открывать и закрывать для каждого объекта не желательно.
Т.е. упростим задачу. Можно не открывать файл повторно, а как-то указать что файл открыт и из него можно читать.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.039 c