Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2009, 09:15   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию Как с tFileStream работать с уже открытыми файлами?

Привет всем! Я вот тут программку делаю...
Короче надо прочитать из файла структуру.

Код:
function getFileRecord(const name: string): tFileRecord;
var
stream: tFileStream;
begin
   stream := tFileStream.Create(name, fmOpenRead);
   stream.Seek(-sizeOf(result), soEnd);
   stream.ReadBuffer(result, sizeOf(result));
   stream.Free;
end;
Итак, здесь всё нормально. Но если файл уже открыт, какой-то другой программой, то вылазит ошибка типа файл уже заюзан и отвали ты к едрени Фени.

Как мне получить доступ к такому файлу? Вот, например, WinRAR шикарно архивирует уже открытые файлы, плееры тоже открывают, по аське и по скайпу отсылаются. Всё одновременно архивируется, играется, отсылается и посылается, а fmOpenRead-ом не открывается. А чем моя программа хуже?
Как мне быть?

Последний раз редактировалось Altera; 12.05.2009 в 09:24.
Altera вне форума Ответить с цитированием
Старый 12.05.2009, 11:33   #2
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Может дело в этой строке
stream.Seek(-sizeOf(result), soEnd);
SERG1980 вне форума Ответить с цитированием
Старый 12.05.2009, 11:42   #3
KORN
Банхаммер
Участник клуба
 
Аватар для KORN
 
Регистрация: 17.02.2007
Сообщений: 1,754
По умолчанию

stream.Seek(-sizeOf(result), soEnd);

ты указывай позицию с которой нужно начинать считывать
Перед тем как спросить ищи на форуме и в GOOGLE
KORN вне форума Ответить с цитированием
Старый 12.05.2009, 12:49   #4
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от KORN Посмотреть сообщение
stream.Seek(-sizeOf(result), soEnd);

ты указывай позицию с которой нужно начинать считывать
Мне очень интересно знать, что в этом коде не так?
Или вам всё надо разжёвывать и в рот впихивать?

Код:
function getFileRecord(const name: string): tFileRecord; { Функция, которая считывает структуру (record) 
tFileRecord с конца файла. Следовательно result принадлежит в типу tFileRecord; 
Здесь всё до всех дошло?}
var
stream: tFileStream; { Указатель, указывающий на объект tFileStream}
begin
   stream := tFileStream.Create(name, fmOpenRead); {Выделяем память под объект stream. 
Открываем для чтерия файл, путь к которому указан в 
строковой переменной name которая передаётся в функцию 
getFileRecord Вот здесь и происходит ошибка, если файл уже отрыт! }
   stream.Seek(-sizeOf(result), soEnd); {Передвигаем каретку на позицию, значение которой равно 
размеру файла без размера считываемой структуры. Напоминаю, что нажная мнеструктура 
находиться в САМОМ конце файла.}
   stream.ReadBuffer(result, sizeOf(result)); {Считываем структуру}
   stream.Free; {Освобождаём память, выделенную под объект stream}
end;
Ещё есть вопросы???


---------------------------------
Люди, мне нужно программно получить доступ к файлу, который уже кем-то открыт и считать из него данные.
Что не ясно. Ошибка не при считывании возникает, а при открытии stream := tFileStream.Create(name, fmOpenRead);

Мне не надо грохать процесс! Допустим юзер фильм смотрит. D:\movie.avi. Следовательно этот файл используется плеером. А как мне получить к нему доступ, не отключая и не прерывая воспроизведение.
Для особо одарёных: Речь не только в фильме и о файле который на диске D и называтся movie.avi!

Последний раз редактировалось Altera; 12.05.2009 в 13:01.
Altera вне форума Ответить с цитированием
Старый 12.05.2009, 13:13   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

попробуйте так:
Код:
stream := TFileStream.Create(name, fmOpenRead  or fmShareDenyNone);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.05.2009, 20:02   #6
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
попробуйте так:
Код:
stream := TFileStream.Create(name, fmOpenRead  or fmShareDenyNone);
Большое спасибо Serge_Bliznykov, можно и просто fmShareDenyNone. respect+
А если ещё и напишешь что все они означают
Цитата:
fmShareCompat = $0000
fmShareExclusive = $0010;
fmShareDenyWrite = $0020;
fmShareDenyRead = $0030
fmShareDenyNone = $0040;
Вообще хорошо будет... ... а хотя и так ясно

Последний раз редактировалось Altera; 12.05.2009 в 20:07.
Altera вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Требуется программист, умеющий работать с принтерами и MIB-файлами nik4al Фриланс 1 15.09.2008 12:55
Как работать с файлами с помощью динамических массивов Герыч Общие вопросы Delphi 4 10.01.2008 12:22
Как работать с dll файлами Artem Общие вопросы Delphi 7 21.09.2007 13:45