|
Вопрос # 1 348/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
может быть будет несколько путанно с объяснением проблемы, но...
с помощью делфи выбрасываю инфу в excel - файл на диске с имя.xls - потом его окрываю для пользователя. имя - краткое название отчета+дата.отчетов около сотни. пользователь может формировать этот самый отчет (или др.) целый день - каждый раз новый файл. поэтому при формировании я удаляю файлы. если какой либо файл открыт - будет ошибка удаления - выдать месаг о событии я могу и все.
Вопрос - как определить что файл открыт, пропустить его?
 |
Вопрос задала: 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 (статус: Посетитель), 18 февраля 2008, 14:31 [#1]:
я использую эту функцию для удаления.
мне необходимо заранее определить открыт ли файл (и какой именно) а потом только удалять
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|