IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Как открыть файл? (https://www.imho.ws/showthread.php?t=58675)

Anthony 14.05.2004 12:40

Как открыть файл?
 
Здравствуйте, господа программисты. Подскажите, кто чем может...

Имеется 2 программы: одна пишет в файл, другая - соответственно - читает. Делают они это через непредсказуемые промежутки времени, и вполне вероятно, что попытаются сделать одновременно.
Можно ли каким-либо образом в "читающей" программе (у "пишущей" необъяснимо исчезли исходники последних 14-и версий) открыть файл незаметно для "писателя"?
(В качестве более чем идеального примера могу привасти FAR'овский view'ер, который не только не блокирует view'ымый файл, но и периодически обновляет его содержимое)

ivahaev 14.05.2004 12:50

А на чем пишешь?

/7y3uK 14.05.2004 13:11

А что за файл? ИМХО потоком открывай...

Anthony 14.05.2004 13:44

Цитата:

Сообщение от ivahaev
А на чем пишешь?

На Delphi.
Цитата:

Сообщение от ivahaev
А что за файл

Обычный текстовый, с log'ами метров на 15-20...

А причем тут потоки (если я правильно понял)? Это и так 2 разных программы

albo 14.05.2004 19:39

Читай хелп по FileMode

/7y3uK 15.05.2004 00:14

2 Anthony
поток и процесс - несколько разные вещи...
Я к тому, что можно не держать файл открытым постоянно, а через промежутки времени или по флагу modify, или еще каким либо из способом потоком вытаскивать данные из файла например в другой файл или в компонент... не знаю как в дельфи (о позор мне:)) но вот в С есть fstream - файловый поток. Для текстовиков архи удобная весчь :)

Anthony 18.05.2004 12:04

Код:

iFileHandle := FileOpen(LName, fmShareDenyNone);
и т.д. по тексту хелпа... Работает.

А не намекнет ли кто-нибудь, как средствами SysUtils сотворить что-то подобное ReadLN?

ivahaev 18.05.2004 12:19

Anthony, вот вариант из DelphiWorld
Цитата:

Даже если файл открыт с низкими привелегиями (используя ReadOnly, ShareReadWrite) , иногда открытие уже открытого файла может приводить к ошибкам, особенно, если это файл интенсивно используется другим приложением. Самый простой способ решить эту проблемму - это использовать MemoryStream вместо непосредственного доступа к файлу:



Код:

var
  Memory: TMemoryStream;
begin
  Memory := TMemoryStream.Create;
  try
    Memory.LoadFromFile('DelphiWorld.dat'); // это он!!
    ...
    Memory.read(...); // Вы можете использовать методы чтения как у файлов
    Memory.Seek(...);
    FileSize := Memory.Size;
    ...
  finally
    Memory.Free;
  end;
end;



Данный способ никогда не открывает файл, а заместо этого создаёт копию его в памяти. Конечно Вы можете и записать в поток (Stream) в Памяти(Memory), но изменения не будут записаны на диск до тех пор, пока Вы не запишете их в файл (командой SaveToFile).

Anthony 18.05.2004 13:51

Цитата:

Memory.LoadFromFile('DelphiWorld.dat');
А вот так-вот я пробовал и Delphi все равно ругалась на то, что файл занят другим процессом:(


Часовой пояс GMT +4, время: 06:40.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.