Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Недостаточно системных ресурсов для завершения операции  [new]
shmelina
Member

Откуда:
Сообщений: 486
Здравствуйте. Есть консольная программа, которая постоянно проверяет сетевой каталог на предмет появления в нем новых файлов и записывает ссылки на них в БД. Ниже упрощенный код этого алгоритма.

  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". Указанный сервер не может выполнить требуемую операцию
<и дальше постоянные ошибки "Указанный сервер не может выполнить требуемую операцию">

После перезапуска программы, все начинает работать нормально. На несколько дней.
Подскажите, пожалуйста. Где может быть ошибка?
14 янв 22, 15:00    [22421105]     Ответить | Цитировать Сообщить модератору
 Re: Недостаточно системных ресурсов для завершения операции  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 55283

shmelina
Где может быть ошибка?

В самом алгоритме её работы. ReadDirectoryChangesW тебе в руки.

Posted via ActualForum NNTP Server 1.5

14 янв 22, 15:04    [22421110]     Ответить | Цитировать Сообщить модератору
 Re: Недостаточно системных ресурсов для завершения операции  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1558
shmelina,

может быть дело в том, что на компьютере, к которому подключаетесь по сети, не серверная Windows. Сталкивался с такой проблемой, вот тут ссылка на решение
пропадает доступ к компьютеру с Windows 7
Не создает ли ваша программа много сетевых подключений в ходе работы? Причина ошибки по ссылке, если я правильно понимаю, как раз из-за того, что для не серверной ОС с настройками по-умолчанию, когда много подключений, такое может быть.

Сообщение было отредактировано: 14 янв 22, 15:18
14 янв 22, 15:09    [22421114]     Ответить | Цитировать Сообщить модератору
 Re: Недостаточно системных ресурсов для завершения операции  [new]
DHDD
Member

Откуда:
Сообщений: 136
FindClose должен быть всегда, независимо от результата FindFirst.
14 янв 22, 15:17    [22421120]     Ответить | Цитировать Сообщить модератору
 Re: Недостаточно системных ресурсов для завершения операции  [new]
L_argo
Member

Откуда:
Сообщений: 1593
Возможно это из-за попытки схватить еще не дописанный файл ?
14 янв 22, 15:17    [22421121]     Ответить | Цитировать Сообщить модератору
 Re: Недостаточно системных ресурсов для завершения операции  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1558
DHDD
FindClose должен быть всегда, независимо от результата FindFirst.
+

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

Сообщение было отредактировано: 14 янв 22, 15:22
14 янв 22, 15:20    [22421125]     Ответить | Цитировать Сообщить модератору
 Re: Недостаточно системных ресурсов для завершения операции  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 55283

DHDD
FindClose должен быть всегда, независимо от результата FindFirst.

Это надо смотреть в коде конкретной RTL. В некоторых версиях это наоборот
приводило к утечке хэндлов.

Posted via ActualForum NNTP Server 1.5

14 янв 22, 15:42    [22421150]     Ответить | Цитировать Сообщить модератору
 Re: Недостаточно системных ресурсов для завершения операции  [new]
Belotsky Serge
Member

Откуда: Гомель
Сообщений: 360
shmelina,
А зачем каждый раз устанавливать текущий каталог в цикле да еще с интервалом 3 сек?
 while True do
  try
    SetCurrentDir(PdfDir);
// ...
    Sleep(3 * 1000);
  except
  end;


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

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

Чтобы гарантировать закрытие ресурса при исключении.
14 янв 22, 15:46    [22421155]     Ответить | Цитировать Сообщить модератору
 Re: Недостаточно системных ресурсов для завершения операции  [new]
shmelina
Member

Откуда:
Сообщений: 486
s62
не серверная Windows

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

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

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

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

Спасибо, поизучаю.
14 янв 22, 15:48    [22421157]     Ответить | Цитировать Сообщить модератору
 Re: Недостаточно системных ресурсов для завершения операции  [new]
shmelina
Member

Откуда:
Сообщений: 486
Belotsky Serge
А зачем каждый раз устанавливать текущий каталог в цикле да еще с интервалом 3 сек?

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

Точно не открываются. Возможно такая ошибка возникает в FindFirst или в FindNext.
14 янв 22, 15:52    [22421160]     Ответить | Цитировать Сообщить модератору
 Re: Недостаточно системных ресурсов для завершения операции  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 55283

shmelina
Сканируются разные каталоги по этому перед каждым циклом устанавливается свой
текущий каталог.

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

Posted via ActualForum NNTP Server 1.5

14 янв 22, 15:56    [22421170]     Ответить | Цитировать Сообщить модератору
 Re: Недостаточно системных ресурсов для завершения операции  [new]
shmelina
Member

Откуда:
Сообщений: 486
Belotsky Serge
А еще я бы переписал код вот так

Наверно вы правы.
14 янв 22, 15:57    [22421174]     Ответить | Цитировать Сообщить модератору
 Re: Недостаточно системных ресурсов для завершения операции  [new]
shmelina
Member

Откуда:
Сообщений: 486
Dimitry Sibiryakov

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

Первым параметром, где "*.pdf"?
\\Server\Файлы\*.pdf
Так?
14 янв 22, 16:00    [22421182]     Ответить | Цитировать Сообщить модератору
 Re: Недостаточно системных ресурсов для завершения операции  [new]
Belotsky Serge
Member

Откуда: Гомель
Сообщений: 360
shmelina
Belotsky Serge
А зачем каждый раз устанавливать текущий каталог в цикле да еще с интервалом 3 сек?

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

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

Сомневаюсь, у меня FindFirst и FindNext крутится месяцами. И ничего не падает.
Но есть современная альтернатива: System.IOUtils.TDirectory, посмотрите метод TDirectory.GetFiles. Это статический метод и он возвращает только имена файлов без TimeStamp. Не забудьте только почистить то что он возвращает и обязательно в блоке try...finally...end.
Ну и напоследок, если файл может внезапно исчезнуть, после FindFirst в блоке repeat ... until пока вы обрабатываете или "отвалиться" сетевая папка то могут быть проблемы.
14 янв 22, 16:12    [22421193]     Ответить | Цитировать Сообщить модератору
 Re: Недостаточно системных ресурсов для завершения операции  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1558
s62
DHDD
FindClose должен быть всегда, независимо от результата FindFirst.
+

Посмотрел описание функции, Search handle открывается при успешном завершении функции и тогда его потом надо закрыть функцией FindClose. Если произошла какая-то ошибка или просто подходящий файл не найден, то возвратится INVALID_HANDLE_VALUE и соответственно, закрывать хэндл потом не надо.
MS
If 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.


Сообщение было отредактировано: 14 янв 22, 16:25
14 янв 22, 16:22    [22421199]     Ответить | Цитировать Сообщить модератору
 Re: Недостаточно системных ресурсов для завершения операции  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 55283

FindFirst и FindFirstFile, хотя и похожи по названию, работают сильно иначе.

Posted via ActualForum NNTP Server 1.5

14 янв 22, 16:58    [22421217]     Ответить | Цитировать Сообщить модератору
 Re: Недостаточно системных ресурсов для завершения операции  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1558
Dimitry Sibiryakov
FindFirst и FindFirstFile, хотя и похожи по названию, работают сильно иначе.
Да, я потом увидел, что тут же FindFirst. Но посмотрел, если ничего не найдено, то по сути то же самое под Windows:
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 ничего не делает:
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}


Сообщение было отредактировано: 14 янв 22, 17:07
14 янв 22, 17:04    [22421218]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить