Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.133.141.6] |
|
Сообщ.
#1
,
|
|
|
Добрый день!
В службе почему-то не выполняется цикл. Пробовал разные циклы (While, repeat). Весь остальной код выполняется, кроме содержимого цикла. Видимо, что-то не так делаю. Подскажите, в чем нюанс? Служба стартует, опрашивает ini, читает из него путь в InBox (E:\inbox\) и должна просмотреть список файлов в этой папке. Все действия службы пушиться в Лог. Вот код процедуры службы: procedure ToService.ServiceExecute(Sender: TService); var FSO,FSW: TFileStream; FLog, Fini: TextFile; LogFileName,IniFileName, InBox, OutBox, FlagBox: string[255]; STime, Attr, FindRes : integer; CoProc, FIB : byte; TmpSt : String; sr: TSearchRec; begin LogFileName := extractfilepath(paramstr(0))+FormatDateTime('yyyymmdd-hhmm',Now)+'-oSRV.log'; IniFileName := extractfilepath(paramstr(0))+'oservice.ini'; AssignFile(FLog, LogFileName); Rewrite(FLog); Writeln(FLog, FormatDateTime('yyyy.mm.dd-hh:mm',Now)+' Service is Started.'); AssignFile(Fini, IniFileName); Reset(FIni); Readln(FIni, TmpSt); STime := StrToInt(TmpSt); Readln(FIni, TmpSt); CoProc := Byte(StrToInt(TmpSt)); Readln(FIni, InBox); Readln(FIni, OutBox); Readln(FIni, FlagBox); CloseFile(Fini); Writeln(FLog, IntToStr(STime)); Writeln(FLog, IntToStr(CoProc)); Writeln(FLog, InBox); Writeln(FLog, OutBox); Writeln(FLog, FlagBox); Writeln(FLog, 'File-scan-start'); FindRes:=FindFirst(InBox+'*.*',faAnyFile,SR); //поиск While FindRes=0 do begin if ((SR.Attr and faDirectory)=faDirectory) and ((SR.Name='.')or(SR.Name='..')) then // все папки и файлы begin Writeln(FLog, sr.Name); FindRes:=FindNext(SR); // продолжить поиск Continue; // продолжить цикл end; Writeln(FLog, 'File-2'); Writeln(FLog, sr.Name); FindRes:=FindNext(SR); // продолжить поиск end; FindClose(SR); //закрвть(остановить)поиск Writeln(FLog, 'File-scan-stop'); CloseFile(FLog); end; |
Сообщ.
#2
,
|
|
|
В обычном приложении проверял работу поиска?
|
Сообщ.
#3
,
|
|
|
Цитата MBo @ В обычном приложении проверял работу поиска? Да, работает. |
Сообщ.
#4
,
|
|
|
Обычно сервис запускается от имени системы, если он зарегистрирован от имени системы.
У системы может не быть прав доступа в папку с теми файлами, поэтому цикл не отрабатывает. Т.е. у обычного приложения, в котором отрабатывает цикл все работает потому, что у учётной записи пользователя есть права на чтение папки. У сервиса их может не быть, если он запускается от другой учетной записи (например от имени system). Рекомендую проверить права папки. И при отладке сервиса глянуть возвращается ли ожидаемое значение строчкой: FindRes:=FindFirst(InBox+'*.*',faAnyFile,SR); //поиск Кроме того, в конец цикла в функциях ServiceExecute следует добавлять строчки Sleep(100); ServiceThread.ProcessRequests(False ); Иначе процесс может перестать отвечать на запросы и выпасть с ошибками. Это связано с тем, что сервисы должны отвечать на запросы системы вовремя, а для того, чтобы они отвечали требуется время и обработка сообщений системы. |
Сообщ.
#5
,
|
|
|
Цитата simsergey @ Спасибо. Как раз, экспериментальным путем пришел к этому ответу. Отладка сервиса велась в виртуальной машине и для удобства в ней был смонтирован диск со структурой папок из основной системы, что бы удобнее было подкладывать данные для проверки. В этом случае, на смонтированную область файловой структуры, права предоставляются с разграничением (т.е. не полностью). При проверке на локальной файловой структуре виртуальной машины, все работает. Спасибо за подсказку про способность сервиса отвечать SCM. С тонкостями использования этой процедуры еще предстоит разобраться. |
Сообщ.
#6
,
|
|
|
n1056,
M Используем тег [code] для добавления текста программы в пост! Устное предупреждение! Читаем правила! |