No borrar una carpeta si contiene archivos no cerrados - página 7

 

Mañana intentaré hacer un script que reproduzca completamente este problema.

Para que la gente no diga que estoy haciendo "ficción" aquí).

Muchas gracias a todos por vuestra predisposición y ayuda para solucionarlo. ))

 

Había un error flotante como este (se describe la secuencia y se adjunta un archivo .ex5 de la biblioteca). Es difícil documentar este tipo de cosas

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Bichos, errores, preguntas

A100, 2016.08.04 00:05

Error al abrir el archivo por el Asesor Experto. ¿Y si, por ejemplo.

1. Eliminar "algo de código irrelevante" (ver más abajo)

2. o eliminar ::Sleep(1000)

no hay ningún error

//Test.mq5
#import "Test001.ex5"
        string f( string file );
#import
string __Period() { return StringSubstr( EnumToString((ENUM_TIMEFRAMES)Period()), 7 ); }
void OnInit()
{
        Print( Symbol(), ",", __Period(), ", результат=", f( "test.txt" ));
}

Secuencia de acciones:

1. Cree un nuevo perfil (por ejemplo, "Prueba")

2. abrir dos nuevos gráficos adjuntando el Asesor Experto Test.ex5 a ambos (ver imagen)

4. Seleccione cualquier otro perfil existente

5. Seleccione el perfil de "Prueba".

resultado:

Mientras que Test001.mq5 tiene este aspecto:

//Test001.mq5
#property library
//---
//здесь некий код не имеющий отношения к делу
//---
string f( string file ) export
{
        ::ResetLastError();
        int hFile = ::FileOpen( file, FILE_READ | FILE_SHARE_READ | FILE_TXT | FILE_ANSI | FILE_COMMON );
        if ( hFile == INVALID_HANDLE )
                return ::StringFormat( "Error(%d): Не был открыт файл: %s", ::GetLastError(), file );
        ::Sleep( 1000 );
        ::FileClose( hFile );
        return "OK";
}

Probado ahora con el archivo de la biblioteca que se adjunta: el resultado es el mismo (el archivo de prueba se abre por separado por ambos EAs, y si simultáneamente, uno de los EAs informa de un error)
2017.08.28 23:40:43.623 Prueba (EURUSD,M15) EURUSD,M15, resultado=OK
2017.08.28 23:40:52.389 Prueba (GBPUSD,M15) GBPUSD,M15, resultado=OK

2017.08.28 23:41:14.387 Prueba (GBPUSD,M15) GBPUSD,M15, result=Error(5004): El archivo no fue abierto: test.txt
2017.08.28 23:41:15.484 Prueba (EURUSD,M15) EURUSD,M15, result=OK


 

Encontré el número de solicitud #1530548, pero no hay comentarios - puede que ya se haya corregido. Si no es así, por favor revise de nuevo

 

Реter Konow:

El archivo es abierto por mi aplicación (navegador de archivos) para ser sobrescrito en otra carpeta.

Cuando se abre el archivo para su lectura , obtenemos el manejador del archivo.

La etiqueta es Konow:

Después de sobrescribir necesito cerrar el archivo pero no puedo - (no hay asa) y solo borro el archivo.

Para escribir en otro archivo, necesito el handle del otro archivo, por lo que tiene sentido almacenarlo en otra variable. Después de escribir en un nuevo archivo, los manejadores de los dos archivos se almacenan en dos variables, y ambos archivos se cierran utilizando esos manejadores.

Etiqueta Konow:

No hay ningún asidero porque el archivo fue creado no se sabe cuándo y no se sabe por quién.

Si el archivo fue creado por John Doe y John Doe, es MUY probable que no sea utilizado por ninguna aplicación. Si abre el archivo con algún propósito, entonces ya tiene un handle obtenido por la función FileOpen y debe cerrarlo antes de borrar la carpeta.

Etiqueta Konow:

Dicho esto, el archivo existe dentro de la carpeta Files y puede ser copiado a otra carpeta y borrado después.

Cuando se copia un archivo de un programa accesible a un programa mql, el manejador del archivo es completamente innecesario.

Reg Konow:

Pero no puedes cerrar ese archivo después de haberlo copiado. No hay asa.

Después de copiar el archivo, el archivo no está abierto y no es necesario cerrarlo.

Etiqueta Konow:

Esta es probablemente la razón por la que seguir borrando FolderClean() con archivos borrados, no funciona.

Esto es un error absoluto.

RetagKonow:

Pregunta: ¿Cómo puedo obtener un asa para este archivo en un programa MQL?

De lo anterior, esta pregunta no tiene sentido. El handle del archivo sólo se obtiene al abrir un archivo para determinar dónde está el puntero del archivo FileTell y FileSeek desde donde leer o escribir, para forzar el volcado de datos al disco FileFlush y por supuesto para cerrar el archivo y liberarlo para que otras aplicaciones trabajen en él.


Por casualidad he descubierto cuál es su problema:

Durante un experimento, se abre una carpeta en el Explorador o en otro gestor de archivos para controlar la creación y el borrado de un archivo. Y una vez que se elimina el archivo, la carpeta permanece ocupada y no puede ser eliminada. El resultado es

2017.08.29 09:42:15.657 Demo_FolderDelete (CADJPY,H4)   Не удалось удалить папку nonempty. Код ошибки=5024

Pero el hecho de que después de un intento infructuoso de eliminar una carpeta, ésta siga ocupada, por desgracia, es un hecho. Esto será ahora objeto de una solicitud a la SD.

ps; Por desgracia, también he metido la pata durante el experimento. Después de escribir en el archivo, restablecer los datos en el disco, trató de abrirlo con el bloc de notas, pero obtuvo en respuesta ...(figura) para cancelar el intento de apertura se olvidó y eso es lo que mantuvo la carpeta y no dejó que se elimina.

Resumen: No hay problemas con los archivos mql.

 

Alexey Viktorov:

Completamente por accidente, he descubierto cuál es su problema:

Durante un experimento, se abre una carpeta en el Explorador u otro gestor de archivos para controlar la creación y el borrado de un archivo. Y después de eliminar el archivo, la carpeta permanece ocupada y no puede ser eliminada. El resultado es

2017.08.29 09:42:15.657 Demo_FolderDelete (CADJPY,H4)   Не удалось удалить папку nonempty. Код ошибки=5024

Pero el hecho de que después de un intento infructuoso de eliminar una carpeta, ésta siga ocupada, por desgracia, es un hecho. Ahora se informará al SR.

Me he encontrado con este comportamiento en circunstancias completamente diferentes - también manteniendo una carpeta abierta para su eliminación, lo que resulta en los programas / scripts / SVN etc fallando para eliminar esa carpeta.

Y el remedio es siempre el mismo: desmontar manualmente esa carpeta. Así que no es un problema de terminal o de editor.

 
Rashid Umarov:

Me he encontrado con este comportamiento en circunstancias completamente diferentes - también manteniendo una carpeta abierta para ser borrada, con el resultado de que los programas/scripts/SVN etc. no podían borrar la carpeta.

Y siempre se trata de la misma manera: derribando manualmente la carpeta en cuestión. Así que no es un problema de terminal o de editor.

He complementado mi post un poco más tarde.

Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio

No borrar una carpeta si hay archivos sin cerrar en ella

Alexey Viktorov, 2017.08.29 08:55


ps; Por desgracia, yo también metí la pata durante el experimento. Después de escribir en el archivo, restablecer los datos en el disco, trató de abrirlo con el bloc de notas, pero obtuvo en respuesta ...(figura) para cancelar el intento de apertura me olvidé y eso es lo que mantuvo la carpeta y no dejó que se borre.

Resumen: No hay problemas con los archivos mql.


Es extraño que hayas citado mi post sin esta adición.

 
Alexey Viktorov:

He complementado mi post un poco más tarde.


Me extraña que hayas citado mi post sin ese añadido.

Sólo para que estés preparado para la respuesta de la SD.

 
Rashid Umarov:

Sólo para que estés preparado para la respuesta de la SD.

Entonces, si entendí la razón del problema, ¿por qué escribir basura desde la SD? Sólo que no dije en voz alta que me negaba a escribirlo... Pensé que era obvio para todos.
 
Rashid Umarov:

Me he encontrado con este comportamiento en circunstancias completamente diferentes - también manteniendo una carpeta abierta para su eliminación, lo que resulta en los programas / secuencias de comandos / SVN etc no ser capaz de eliminar la carpeta.

Y el remedio es siempre el mismo: desmontar manualmente esa carpeta. Así que no es un problema de terminal o de editor.

Y el hecho de abrir una carpeta en un gestor de archivos, NO un ARCHIVO, no afecta a su eliminación por parte de mql.

 
Alexey Viktorov:

1. Mientras se abre un archivo para su lectura , se obtiene el manejador del archivo.

2. Para escribir en otro archivo necesitamos otro manejador de archivo, por lo que es razonable almacenarlo en otra variable. Después de escribir en un nuevo archivo, los manejadores de los dos archivos se almacenan en dos variables, y ambos archivos se cierran de acuerdo con estos manejadores.

3. si el archivo fue creado de forma desconocida y por una persona desconocida, hay una MUY buena posibilidad de que el archivo no esté ocupado por ninguna aplicación. Si está abriendo el archivo para algún propósito, ya tiene un manejador FileOpen y debería cerrarlo antes de borrar la carpeta.

4. Cuando se copia un archivo de un programa disponible al mql, el manejador del archivo es absolutamente innecesario.

5. Una vez que se ha copiado un archivo, ese archivo no está abierto y no es necesario cerrarlo.


1 El manejador sólo es necesario para la función FileClose. No abro el archivo. Se creó antes que yo. Sólo lo copio y lo borro. No puedo cerrarlo porque no hay asa.

2. Para copiar (FileCopy), para mover (FileMove), no se necesita el manejador del archivo. Consulte la documentación.

3. Si abro un archivo creado por otra persona utilizando la función FileOpen, no obtendré su manejador. No se sabe en absoluto qué asa obtendré. Puede ser el suyo o puede ser uno muy diferente. Intenté obtener el handle del archivo de otra persona para poder cerrar FileClose después de la operación de copia. No funcionó.

4. Al copiar, no se necesita el asa. Se copia sin problemas. Pero el archivo se abre automáticamente para ser copiado. Además, no puedo cerrarlo con FileClose porque no hay asa. Probablemente por eso FolderClean no funciona después de borrar los archivos copiados.

5. ¿Cómo sabes que el archivo no está abierto después de copiarlo? No se abrió explícitamente con la función FileOpen, pero se copió con ella, lo que significa que está abierta. Por lo tanto, sigue abierto después de copiar e incluso después de borrar. Probablemente.

Razón de la queja: