Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как определить, что файл DLL занят? / 18 сообщений из 18, страница 1 из 1
05.11.2017, 16:55:30
    #39548018
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что файл DLL занят?
Добрый день!
При запуске приложения определяю контрольную сумму файла DLL, после чего первое приложение начинает использовать DLL.
При запуске второго экземпляра программы второй экземпляр начинает определять контрольную сумму этой-же DLL. Выскакивает ошибка I/O error 32.

Пробовал проверять занятость файла, но при AssignFile(AFile,AFileName); во втором экземпляре выскакивает эта-же ошибка.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
procedure TDM1.ActDLLExistsExecute(Sender: TObject); //Проверка наличия DLL из списка
    function isFileOpen( var f: File ) : boolean;
    begin
       with TFileRec(f) do
         Result := (Handle<>0) and (Mode<>fmClosed);
    end;
var fn: string;  Ffs: File;
begin
  QDLLFiles.Open;
  while not QDLLFiles.Eof do
    begin
      fn:=DM1.QDLLFilesGoal.AsString+DM1.QDLLFilesName.AsString;
      if not FileExists(fn) then begin  
                                   DM1.QDLLFilesBODY.SaveToFile(fn); 
                                 end
                            else begin
                                 AssignFile(Ffs,fn); //Здесь во втором экземпляре ошибка I/O error 32  
                                 Reset(Ffs);
                                 if isFileOpen(Ffs) then //Если этой строчки нет, то ошибка в GetFileCRC(fn), поскольку там тоже есть AssignFile
                                    if GetFileCRC(fn)<>DM1.QDLLFilesCRC.Value then begin
                                                                                     DM1.QDLLFilesBODY.SaveToFile(fn);  
                                                                                   end;

                                 CloseFile(Ffs);
                              end;
      QDLLFiles.Next;
    end;
  QDLLFiles.Close;
end;
...
Рейтинг: 0 / 0
05.11.2017, 16:58:18
    #39548019
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что файл DLL занят?
zeon11,

скопировать файл dll в темп и там считать не пробовал?
...
Рейтинг: 0 / 0
05.11.2017, 17:00:33
    #39548020
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что файл DLL занят?
andreymx,
Хорошая мысль, если другого решения не будет то воспользуюсь этим советом. Спасибо.
...
Рейтинг: 0 / 0
05.11.2017, 17:26:25
    #39548027
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что файл DLL занят?
zeon11,

Reset, по дефолту, открывает файл в режиме чтение+запись. Вариантов решения 2:
1. Делать FileMode := 0; но это кю.
2. Работать с файлом по-человечески, либо FileOpen+FileRead либо через файловый стрим, указав, что файл открывается только для чтения (fmOpenRead Or fmShareDenyWrite).
...
Рейтинг: 0 / 0
05.11.2017, 17:30:00
    #39548028
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что файл DLL занят?
zeon11andreymx,
Хорошая мысль, если другого решения не будет то воспользуюсь этим советом. Спасибо.не, плохой мой вариант
лишний раз куда-то копировать
...
Рейтинг: 0 / 0
05.11.2017, 19:11:18
    #39548049
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что файл DLL занят?
Kazantsev Alexeyzeon11,

Reset, по дефолту, открывает файл в режиме чтение+запись. Вариантов решения 2:
1. Делать FileMode := 0; но это кю.
2. Работать с файлом по-человечески, либо FileOpen+FileRead либо через файловый стрим, указав, что файл открывается только для чтения (fmOpenRead Or fmShareDenyWrite).

Не вижу пути, как через TFileStream определить, что файл занят другим приложением.
Если только воспользоваться идеей andreymx'а, не заморачиваться с занятостью файла, а сразу через TFileStream вытягивать файл в безопасное место и там определять его контрольную сумму?
...
Рейтинг: 0 / 0
05.11.2017, 19:14:15
    #39548050
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что файл DLL занят?
Kazantsev Alexeyzeon11,

Reset, по дефолту, открывает файл в режиме чтение+запись. Вариантов решения 2:
1. Делать FileMode := 0;
но это кю.
2. Работать с файлом по-человечески, либо FileOpen+FileRead либо через файловый стрим, указав, что файл открывается только для чтения (fmOpenRead Or fmShareDenyWrite).

До Reset 'а к сожалению не доходит, вылетает ещё на AssignFile
...
Рейтинг: 0 / 0
05.11.2017, 19:58:26
    #39548059
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что файл DLL занят?
zeon11Не вижу пути, как через TFileStream определить, что файл занят другим приложением.

Не надо определять, что он занят. Надо сделать так, чтобы файл открывался даже если
занят
.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.11.2017, 20:28:03
    #39548067
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что файл DLL занят?
Dimitry Sibiryakovzeon11Не вижу пути, как через TFileStream определить, что файл занят другим приложением.

Не надо определять, что он занят. Надо сделать так, чтобы файл открывался даже если
занят
.


Так это не проблема. Как из TFileStream получить контрольную сумму файла?
...
Рейтинг: 0 / 0
05.11.2017, 20:59:40
    #39548082
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что файл DLL занят?
CRC это алгоритм который подсчитывает контрольную сумму по содержимому файла.
TFileStream позволяет получить содержимое, осталось это содержимое отдать в функцию расчета CRC.

P.S. Когда уже из Delphi выпилят AssignFile и прочую мертвечину, ну или введут директиву, которая отключит (а лучше включит для совместимости) это безобразие....
...
Рейтинг: 0 / 0
05.11.2017, 21:06:23
    #39548084
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что файл DLL занят?
zeon11До Reset 'а к сожалению не доходит, вылетает ещё на AssignFile
На самом деле вылетает на Reset, просто отладчик показывает строку за той, на которой произошла ошибка.
...
Рейтинг: 0 / 0
05.11.2017, 21:59:28
    #39548104
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что файл DLL занят?
X-CiteКогда уже из Delphi выпилят AssignFile и прочую мертвечину, ну или введут директиву, которая отключит (а лучше включит для совместимости) это безобразие....Нафига? Кому оно мешает? А для чтения текстовых файлов так вообще ничего нет
...
Рейтинг: 0 / 0
05.11.2017, 22:06:10
    #39548108
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что файл DLL занят?
zeon11Как из TFileStream получить контрольную сумму файла?

Точно так же как и из File. Разницы никакой.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.11.2017, 22:41:35
    #39548127
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что файл DLL занят?
zeon11, матчасть:

http://www.gunsmoker.ru/2011/10/pascal.html - см. "Общие принципы работы с файлами Pascal", "3. Далее файл открывается. Открывать файл можно в трёх режимах...", про FileMode, а также ниже - про обработку ошибок.

http://www.gunsmoker.ru/2011/11/blog-post_12.html - что надо использовать в современных программах.
...
Рейтинг: 0 / 0
06.11.2017, 05:03:56
    #39548249
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что файл DLL занят?
Сделал пока так:
В функции определения CRC между AssignFile и Reset поставил FileMode := 0;

Код: pascal
1.
2.
3.
4.
5.
.....
  AssignFile(Fi,FileName);
  FileMode := 0;
  Reset(Fi);
.......



вроде проблема решена. Спасибо.
...
Рейтинг: 0 / 0
06.11.2017, 11:23:02
    #39548292
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что файл DLL занят?
В свежих средах можно еще посмотреть, чтение:
TFile.ReadAllBytes, TFile.ReadAllLines, TFile.ReadAllText
запись:
TFile.WriteAllBytes, TFile.WriteAllLines, TFile.WriteAllText, TFile.AppendText
...
Рейтинг: 0 / 0
06.11.2017, 15:19:13
    #39548397
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что файл DLL занят?
zeon11вроде проблема решена. Спасибо

Застрелись.
...
Рейтинг: 0 / 0
06.11.2017, 17:40:47
    #39548483
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что файл DLL занят?
GunSmokerzeon11вроде проблема решена. Спасибо

Застрелись.

Тем не менее, спасибо за ссылки.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как определить, что файл DLL занят? / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]