Pregunta

Recibo un error EInOutError con el mensaje 'Demasiados archivos abiertos' al ejecutar este bloque de código repetidamente durante algún tiempo desde una serie de subprocesos del cliente:

var InputFile : Text;
...
Assign (InputFile, FileName);
Reset (InputFile)
try
  // do some stuff
finally
  CloseFile (InputFile);
end;

El número de subprocesos del cliente es de aproximadamente 10, por lo que solo se pueden abrir 10 archivos en cualquier momento. ¿Existe alguna posibilidad de que Delphi se niegue a cerrar archivos de inmediato? ¿Puedo asegurarme de que lo hace? ¿O estoy cometiendo un error aquí? Este es el único lugar donde abro archivos y el bloque try..finally debería garantizar que los archivos abiertos se cierren, ¿no?

REEDIT: olvida la edición

¿Fue útil?

Solución

Solo puedo recomendarte que uses la versión más " moderna " Facilidades para el tratamiento de archivos. No sé si hay un límite de archivos abiertos con la API de Windows, pero acabo de probar y podría abrir fácilmente 1000 flujos en paralelo:

procedure TForm1.Button1Click(Sender: TObject);
var
  Strs: TList;
  i: integer;
begin
  Strs := TList.Create;
  try
    for i := 1 to 1000 do begin
      Strs.Add(TFileStream.Create('D:\foo.txt', fmOpenRead or fmShareDenyWrite));
    end;
  finally
    FreeObjectList(Strs);
  end;
end;

Nunca entendí por qué las personas todavía usan archivos sin tipo en lugar de TStream y sus descendientes en el nuevo código.

Editar: En tu comentario, escribes que solo deseas leer archivos de texto sin formato; si es así, crea un TStringList y usa su LoadFromFile () método.

Otros consejos

No estás ejecutando esto en una computadora antigua con Windows 9x, ¿verdad? Si es así, es posible que te encuentres con un problema con el identificador de archivos de DOS.

Delphi se cierra inmediatamente en el CloseFile. Tu código de ejemplo parece ser correcto.

Vuelve a intentarlo sin nada entre intentarlo y finalmente.

Hay ES un problema de seguridad de subprocesos aquí, aunque no puedo ver cómo podría causar el problema.

El problema es que el reinicio utiliza la variable global FileMode.

En cuanto a los subprocesos del cliente, ¿estás seguro de que no se están escapando en conexiones rotas o algo así?

Podría ser útil poner algo de salida de depuración junto con Restablecer y Cerrar para que pueda ver cuánto tiempo tiene abierto el archivo en cada subproceso.

¿Realmente necesitas hilos? Parece que te están causando problemas. Tu código sería más fácil de depurar sin ellos.

Este código debería funcionar bien. No hay problemas conocidos relacionados con el uso de archivos desde código subprocesado (que yo sepa). Usamos dichos modismos con bastante regularidad y todo funciona bien.

Yo sugeriría agregar algún código de registro (antes de Asignar y Cerrar archivo) para ver si a) el cierre se ejecuta yb) realmente solo hay 10 subprocesos en ejecución. Quizás la lógica de terminación de tu hilo sea defectuosa y CloseFile nunca se ejecute.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top