powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Недостаточно системных ресурсов для завершения операции
17 сообщений из 17, страница 1 из 1
Недостаточно системных ресурсов для завершения операции
    #40126624
shmelina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. Есть консольная программа, которая постоянно проверяет сетевой каталог на предмет появления в нем новых файлов и записывает ссылки на них в БД. Ниже упрощенный код этого алгоритма.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  while True do
  try
    SetCurrentDir(PdfDir);
    if FindFirst('*.pdf', faAnyFile, SR) = 0 then
    begin
      repeat
        { Здесь есть обращения к SR.Name и SR.TimeStamp }
      until FindNext(SR) <> 0;
      FindClose(SR);
    end;
    Sleep(3 * 1000);
  except
    on E: Exception do
    begin
      AddToLog(E.ClassName + ': ' + E.Message);
      Sleep(60 * 1000);
    end;
  end;



Через какое-то время (через несколько дней) в лог-файле начинают появляться ошибки:
12.01.2022 9:11:43: EFOpenError: Cannot open file "\\Server\Файлы\1.pdf". Недостаточно системных ресурсов для завершения операции
12.01.2022 9:12:43: EFOpenError: Cannot open file "\\Server\Файлы\1.pdf". Недостаточно системных ресурсов для завершения операции
12.01.2022 9:13:43: EFOpenError: Cannot open file "\\Server\Файлы\2.pdf". Указанный сервер не может выполнить требуемую операцию
12.01.2022 9:14:47: EFOpenError: Cannot open file "\\Server\Файлы\1.pdf". Указанный сервер не может выполнить требуемую операцию
12.01.2022 9:15:47: EFOpenError: Cannot open file "\\Server\Файлы\1.pdf". Указанный сервер не может выполнить требуемую операцию
<и дальше постоянные ошибки "Указанный сервер не может выполнить требуемую операцию">

После перезапуска программы, все начинает работать нормально. На несколько дней.
Подскажите, пожалуйста. Где может быть ошибка?
...
Рейтинг: 0 / 0
Недостаточно системных ресурсов для завершения операции
    #40126626
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shmelinaГде может быть ошибка?

В самом алгоритме её работы. ReadDirectoryChangesW тебе в руки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Недостаточно системных ресурсов для завершения операции
    #40126628
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shmelina,

может быть дело в том, что на компьютере, к которому подключаетесь по сети, не серверная Windows. Сталкивался с такой проблемой, вот тут ссылка на решение
пропадает доступ к компьютеру с Windows 7
Не создает ли ваша программа много сетевых подключений в ходе работы? Причина ошибки по ссылке, если я правильно понимаю, как раз из-за того, что для не серверной ОС с настройками по-умолчанию, когда много подключений, такое может быть.
...
Рейтинг: 0 / 0
Недостаточно системных ресурсов для завершения операции
    #40126631
DHDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FindClose должен быть всегда, независимо от результата FindFirst.
...
Рейтинг: 0 / 0
Недостаточно системных ресурсов для завершения операции
    #40126632
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно это из-за попытки схватить еще не дописанный файл ?
...
Рейтинг: 0 / 0
Недостаточно системных ресурсов для завершения операции
    #40126633
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DHDD
FindClose должен быть всегда, независимо от результата FindFirst.
+

s62
Причина ошибки по ссылке, если я правильно понимаю, как раз из-за того, что для не серверной ОС с настройками по-умолчанию, когда много подключений, такое может быть.
Скорее наверное, когда много файлов открыто или что-то типа такого.
...
Рейтинг: 0 / 0
Недостаточно системных ресурсов для завершения операции
    #40126646
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DHDDFindClose должен быть всегда, независимо от результата FindFirst.

Это надо смотреть в коде конкретной RTL. В некоторых версиях это наоборот
приводило к утечке хэндлов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Недостаточно системных ресурсов для завершения операции
    #40126651
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
shmelina,
А зачем каждый раз устанавливать текущий каталог в цикле да еще с интервалом 3 сек?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
 while True do
  try
    SetCurrentDir(PdfDir);
// ...
    Sleep(3 * 1000);
  except
  end;



А файлики по-видимому все-таки открываются, т.к. "Cannot open file "\\Server\Файлы\1.pdf"", а не только проверяется SR.Name и SR.TimeStamp. И видимо не все файлы закрываются внутри repeat...until ;

А еще я бы переписал код вот так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
if FindFirst('*.pdf', faAnyFile, SR) = 0 then
    try
      repeat
        { Здесь есть обращения к SR.Name и SR.TimeStamp }
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;


Чтобы гарантировать закрытие ресурса при исключении.
...
Рейтинг: 0 / 0
Недостаточно системных ресурсов для завершения операции
    #40126653
shmelina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62
не серверная Windows

Жду, когда админ даст права логи там посмотреть. Эту ошибку ведь сетевой компьютер выдает? Не локальный?
DHDD
FindClose должен быть всегда, независимо от результата FindFirst.

Встречал на этом форуме как раз обратное мнение. Да и пример в справке об этом говорит.
L_argo
Возможно это из-за попытки схватить еще не дописанный файл ?

Ошибка повторяется постоянно. Файл бы давно дописался. И если не закрывать программу и попробовать открывать файл по сети из той же сессии, что и программа, то он открывается.
s62
Скорее наверное, когда много файлов открыто или что-то типа такого.

Файлы не открываются. Они перебираются в цикле и ссылки на новые пишутся в БД.
Dimitry Sibiryakov
ReadDirectoryChangesW тебе в руки.

Спасибо, поизучаю.
...
Рейтинг: 0 / 0
Недостаточно системных ресурсов для завершения операции
    #40126655
shmelina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belotsky Serge
А зачем каждый раз устанавливать текущий каталог в цикле да еще с интервалом 3 сек?

Это часть кода. Сканируются разные каталоги по этому перед каждым циклом устанавливается свой текущий каталог.
Belotsky Serge
А файлики по-видимому все-таки открываются

Точно не открываются. Возможно такая ошибка возникает в FindFirst или в FindNext.
...
Рейтинг: 0 / 0
Недостаточно системных ресурсов для завершения операции
    #40126662
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shmelinaСканируются разные каталоги по этому перед каждым циклом устанавливается свой
текущий каталог.

Для сканирования каталога его необязательно делать текущим. Достаточно указать в
качестве параметра FindFirst.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Недостаточно системных ресурсов для завершения операции
    #40126664
shmelina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belotsky Serge
А еще я бы переписал код вот так

Наверно вы правы.
...
Рейтинг: 0 / 0
Недостаточно системных ресурсов для завершения операции
    #40126668
shmelina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Для сканирования каталога его необязательно делать текущим. Достаточно указать в
качестве параметра FindFirst.

Первым параметром, где "*.pdf"?
\\Server\Файлы\*.pdf
Так?
...
Рейтинг: 0 / 0
Недостаточно системных ресурсов для завершения операции
    #40126676
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
shmelina
Belotsky Serge
А зачем каждый раз устанавливать текущий каталог в цикле да еще с интервалом 3 сек?

Это часть кода. Сканируются разные каталоги по этому перед каждым циклом устанавливается свой текущий каталог.
Belotsky Serge
А файлики по-видимому все-таки открываются

Точно не открываются. Возможно такая ошибка возникает в FindFirst или в FindNext.

Сомневаюсь, у меня FindFirst и FindNext крутится месяцами. И ничего не падает.
Но есть современная альтернатива: System.IOUtils.TDirectory , посмотрите метод TDirectory.GetFiles . Это статический метод и он возвращает только имена файлов без TimeStamp. Не забудьте только почистить то что он возвращает и обязательно в блоке try...finally...end.
Ну и напоследок, если файл может внезапно исчезнуть, после FindFirst в блоке repeat ... until пока вы обрабатываете или "отвалиться" сетевая папка то могут быть проблемы.
...
Рейтинг: 0 / 0
Недостаточно системных ресурсов для завершения операции
    #40126678
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62
DHDD
FindClose должен быть всегда, независимо от результата FindFirst.
+

Посмотрел описание функции , Search handle открывается при успешном завершении функции и тогда его потом надо закрыть функцией FindClose. Если произошла какая-то ошибка или просто подходящий файл не найден, то возвратится INVALID_HANDLE_VALUE и соответственно, закрывать хэндл потом не надо.
MSIf the function succeeds, the return value is a search handle used in a subsequent call to FindNextFile or FindClose, and the lpFindFileData parameter contains information about the first file or directory found.
If the function fails or fails to locate files from the search string in the lpFileName parameter, the return value is INVALID_HANDLE_VALUE and the contents of lpFindFileData are indeterminate. To get extended error information, call the GetLastError function.
If the function fails because no matching files can be found, the GetLastError function returns ERROR_FILE_NOT_FOUND.
...
Рейтинг: 0 / 0
Недостаточно системных ресурсов для завершения операции
    #40126688
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FindFirst и FindFirstFile, хотя и похожи по названию, работают сильно иначе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Недостаточно системных ресурсов для завершения операции
    #40126689
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
FindFirst и FindFirstFile, хотя и похожи по названию, работают сильно иначе.
Да, я потом увидел, что тут же FindFirst. Но посмотрел, если ничего не найдено, то по сути то же самое под Windows:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
function FindFirst(const Path: string; Attr: Integer;
  var F: TSearchRec): Integer;
const
  faSpecial = faHidden or faSysFile or faDirectory;
{$IFDEF MSWINDOWS}
begin
  F.ExcludeAttr := not Attr and faSpecial;
  F.FindHandle := FindFirstFile(PChar(Path), F.FindData);
  if F.FindHandle <> INVALID_HANDLE_VALUE then
  begin
    Result := FindMatchingFile(F);
    if Result <> 0 then FindClose(F);
  end
  else
    Result := GetLastError;
end;
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}



И соответственно, в таком случае и FindClose ничего не делает:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure FindClose(var F: TSearchRec);
begin
{$IFDEF MSWINDOWS}
  if F.FindHandle <> INVALID_HANDLE_VALUE then
  begin
    Winapi.Windows.FindClose(F.FindHandle);
    F.FindHandle := INVALID_HANDLE_VALUE;
  end;
{$ENDIF MSWINDOWS}
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Недостаточно системных ресурсов для завершения операции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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