Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 348

/ вопрос открыт /

Приветствую, уважаемые эксперты!
может быть будет несколько путанно с объяснением проблемы, но...
с помощью делфи выбрасываю инфу в excel - файл на диске с имя.xls - потом его окрываю для пользователя. имя - краткое название отчета+дата.отчетов около сотни. пользователь может формировать этот самый отчет (или др.) целый день - каждый раз новый файл. поэтому при формировании я удаляю файлы. если какой либо файл открыт - будет ошибка удаления - выдать месаг о событии я могу и все.
Вопрос - как определить что файл открыт, пропустить его?

Приложение:
  1.  


SadKitty Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: SadKitty (статус: Посетитель)
Вопрос отправлен: 18 февраля 2008, 09:23
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: min@y™

Используй для удаления API-функцию

BOOL DeleteFile(
LPCTSTR lpFileName // pointer to name of file to delete
);

и анализируй её результат. Если false - удалить не удалось. А причину, почему не удалось (файл не найден/открыт другим приложением/нет прав доступа) можно узнать через GetLastError().

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 18 февраля 2008, 09:51
Оценка за ответ: 1

Комментарий к оценке: написано - удаляю файлы и могу выдать сообщение об ошибке(причину)
необходимо узнать открыт ли файл до удаления

Ответ #2. Отвечает эксперт: Вадим К

Здравствуйте, SadKitty!
Что бы узнать, надо попробывать самому открыть файл, причём попробывать в монопольном доступе. если получиться - файл не занят. То что мы не знам структуры файла нас волновать не должно.

procedure TForm2.Button1Click(Sender: TObject);
  var fs:TFileStream;
begin
  if not OpenDialog1.Execute then Exit;
    try
    fs:=TFileStream.Create(OpenDialog1.FileName, fmOpenReadWrite + fmShareExclusive); //запрашиваем по максимуму -
чтение и запись в эксклюзивном режиме. Тоесть "только я".
    fs.Free;
    except
      ShowMessage('Файл занят');
    end;
end;
попробуйте этот код, работает справно. И не только для экселя, а и для многих других програм, которые держат файл открытым.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 19 февраля 2008, 00:53
Оценка за ответ: 5

Комментарий к оценке: большое спасибо за помощь

Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 18 февраля 2008, 14:31; участников в обсуждении: 1.
SadKitty

SadKitty (статус: Посетитель), 18 февраля 2008, 14:31 [#1]:

я использую эту функцию для удаления.
мне необходимо заранее определить открыт ли файл (и какой именно) а потом только удалять

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:39
Выполнено за 0.03 сек.