Una cartella non viene cancellata se contiene file non chiusi - pagina 7

 

Domani cercherò di fare uno script che riproduca completamente questo problema.

Così la gente non dirà che sto facendo "fiction" qui).

Grazie mille a tutti voi per la vostra disponibilità e l'assistenza nel risolverlo. ))

 

C'era un errore fluttuante come questo (la sequenza è descritta e un file .ex5 di libreria era allegato). È difficile documentare questo tipo di cose

Forum sul trading, sistemi di trading automatico e test di strategia

Bug, bug, domande

A100, 2016.08.04 00:05

Errore nell'apertura del file da parte di Expert Advisor. E se per esempio.

1. Rimuovere "alcuni codici irrilevanti" (vedi sotto)

2. o rimuovere ::Sleep(1000)

non c'è nessun errore

//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" ));
}

Sequenza di azioni:

1. Creare un nuovo profilo (ad esempio "Test")

2. aprire due nuovi grafici allegando l'Expert Advisor Test.ex5 a entrambi (vedi immagine)

4. Seleziona qualsiasi altro profilo esistente

5. Selezionare il profilo "Test".

risultato:

Mentre Test001.mq5 si presenta così:

//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";
}

Provato ora con il file di libreria allegato: il risultato è lo stesso (il file di prova viene aperto separatamente da entrambi gli EA, e se contemporaneamente, uno degli EA segnala un errore)
2017.08.28 23:40:43.623 Test (EURUSD,M15) EURUSD,M15, result=OK
2017.08.28 23:40:52.389 Test (GBPUSD,M15) GBPUSD,M15, result=OK

2017.08.28 23:41:14.387 Test (GBPUSD,M15) GBPUSD,M15, result=Error(5004): File was not opened: test.txt
2017.08.28 23:41:15.484 Test (EURUSD,M15) EURUSD,M15, result=OK


 

Ho trovato il numero di applicazione #1530548, ma nessun commento - potrebbe essere già stato corretto. In caso contrario, si prega di rivedere di nuovo

 

Реter Konow:

Ilfile viene aperto dalla mia applicazione (navigatore di file) per essere sovrascritto in un'altra cartella.

Quando il file viene aperto per la lettura , otteniamo l'handle del file.

L'etichetta è Konow:

Dopo la sovrascrittura ho bisogno di chiudere il file ma non posso - (nessun handle) e cancello solo il file.

Per scrivere su un altro file, ho bisogno dell'handle dell'altro file, quindi ha senso memorizzarlo in un'altra variabile. Dopo aver scritto in un nuovo file, gli handle dei due file vengono memorizzati in due variabili, ed entrambi i file vengono chiusi usando questi handle.

Tag Konow:

Non c'è un handle perché il file è stato creato non si sa quando e non si sa da chi.

Se il file è stato creato da John Doe e John Doe, è MOLTO probabile che non sia usato da nessuna applicazione. Se aprite il file per qualche scopo, allora avete già un handle ottenuto dalla funzione FileOpen e dovreste chiuderlo prima di cancellare la cartella.

Tag Konow:

Detto questo, il file esiste nella cartella Files e può essere copiato in un'altra cartella e poi cancellato.

Quando si copia un file da un programma accessibile a un programma mql, l'handle del file non è assolutamente necessario.

Reg Konow:

Ma non potete chiudere quel file dopo averlo copiato. Non c'è nessuna maniglia.

Dopo aver copiato il file, il file non è aperto e non c'è bisogno di chiuderlo.

Tag Konow:

Questo è probabilmente il motivo per cui cancellare ulteriormente FolderClean() con i file cancellati non funziona.

Questo è un errore assoluto.

RetagKonow:

Domanda: come posso ottenere un handle di questo file in un programma MQL?

Da quanto sopra, questa domanda non ha senso. Un handle di file si ottiene solo quando un file viene aperto per determinare da dove il puntatore del file FileTell e FileSeek dovrebbe essere letto o scritto, forzatamente scaricato su disco da FileFlush e, naturalmente, chiuso per liberare il file per altre applicazioni per lavorarci sopra.


Per caso ho scoperto qual è il vostro problema:

Durante un esperimento, una cartella è aperta in Explorer o in un altro file manager per monitorare la creazione e la cancellazione di un file. E una volta che il file viene cancellato, la cartella rimane occupata e non può essere cancellata. Il risultato è

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

Ma il fatto che dopo un tentativo infruttuoso di cancellare una cartella, questa cartella rimane occupata, ahimè, è un fatto. Questo sarà ora oggetto di una domanda alla SD.

ps; Ahimè, ho anche sbagliato durante l'esperimento. Dopo aver scritto sul file, resettato i dati sul disco, ha provato ad aprirlo con il blocco note, ma ha ottenuto in risposta ...(figura) di annullare il tentativo di apertura dimenticato e questo è ciò che ha mantenuto la cartella e non ha lasciato che fosse cancellata.

Sommario: Nessun problema con i file mql.

 

Alexey Viktorov:

Completamente per caso, ho scoperto qual è il vostro problema:

Durante un esperimento, una cartella è aperta in Explorer o in un altro file manager per monitorare la creazione e la cancellazione di un file. E dopo aver cancellato il file, la cartella rimane occupata e non può essere cancellata. Il risultato è

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

Ma il fatto che dopo un tentativo infruttuoso di cancellare una cartella, questa cartella rimane occupata, ahimè, è un fatto. Questo sarà ora riferito al SR.

Mi sono imbattuto in questo comportamento in circostanze completamente diverse - anche tenendo una cartella aperta per l'eliminazione, con il risultato che programmi/scripts/SVN ecc. non riescono a cancellare quella cartella.

E la cura è sempre la stessa: eliminare manualmente quella cartella. Quindi non è certo un problema di terminale o di editor.

 
Rashid Umarov:

Mi sono imbattuto in questo comportamento in circostanze completamente diverse - anche tenendo una cartella aperta per l'eliminazione, con il risultato che programmi/scripts/SVN ecc. non potevano eliminare la cartella.

Ed è sempre trattato allo stesso modo - eliminando manualmente la cartella data. Quindi non è certo un problema di terminale o di editor.

Ho completato il mio post un po' più tardi.

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Non cancellare una cartella se ci sono file non chiusi in essa

Alexey Viktorov, 2017.08.29 08:55


ps; Ahimè, anch'io ho sbagliato durante l'esperimento. Dopo aver scritto al file, resettato i dati sul disco, ho provato ad aprirlo con il blocco note, ma ho ottenuto in risposta ...(figura) di annullare il tentativo di apertura che ho dimenticato ed è quello che ha mantenuto la cartella e non ha permesso di cancellarla.

Sommario: Nessun problema con i file mql.


Strano che tu abbia citato il mio post senza questa aggiunta.

 
Alexey Viktorov:

Ho completato il mio post un po' più tardi.


Strano che tu abbia citato il mio post senza questa aggiunta.

Solo per essere preparati alla risposta della SD.

 
Rashid Umarov:

Solo per essere preparati alla risposta della SD.

Quindi, se ho capito il motivo del problema, perché scrivere merda dalla SD? Solo che non ho detto ad alta voce che mi rifiutavo di scriverlo... Ho pensato che fosse ovvio per tutti.
 
Rashid Umarov:

Ho riscontrato questo comportamento in circostanze completamente diverse - anche mantenendo una cartella aperta per l'eliminazione, con il risultato che programmi/scripts/SVN ecc. non sono in grado di eliminare la cartella.

E la cura è sempre la stessa: eliminare manualmente quella cartella. Quindi non è certo un problema di terminale o di editor.

E il fatto di aprire una cartella in un file manager, NON un FILE, non influisce sulla sua rimozione da parte di mql.

 
Alexey Viktorov:

1. Durante l'apertura di un file per la lettura , ottiene l'handle del file.

2. Per scrivere su un altro file abbiamo bisogno di un altro handle di file, quindi è ragionevole memorizzarlo in un'altra variabile. Dopo aver scritto in un nuovo file, gli handle dei due file vengono memorizzati in due variabili, ed entrambi i file vengono chiusi in base a questi handle.

3. se il file è stato creato non si sa quando e da una persona sconosciuta, c'è una MOLTO buona probabilità che il file non sia occupato da nessuna applicazione. Se state aprendo il file per qualche scopo, avete già un handle FileOpen e dovreste chiuderlo prima di cancellare la cartella.

4. Quando si copia un file da un programma disponibile all'mql, l'handle del file non è assolutamente necessario.

5. Una volta che un file viene copiato, quel file non è aperto e non c'è bisogno di chiuderlo.


1 L'handle è necessario solo per la funzione FileClose. Non apro il file. È stato creato prima di me. Mi limito a copiarlo e a cancellarlo. Non posso chiuderlo perché non c'è una maniglia.

2. Per copiare (FileCopy), per spostare (FileMove), il manico del file non è necessario. Si prega di fare riferimento alla documentazione.

3. Se apro un file creato da qualcuno prima con la funzione FileOpen, non ottengo il suo handle. Non si sa affatto quale maniglia avrò. Può essere il suo o può essere un altro. Ho cercato di ottenere l'handle del file di qualcun altro per poterlo chiudere FileClose dopo l'operazione di copia. Non ha funzionato.

4. Quando si copia, la maniglia non è necessaria. Viene copiato senza problemi. Ma il file viene aperto automaticamente per la copia. Inoltre, non posso chiuderlo con FileClose perché non c'è nessun handle. Questo è probabilmente il motivo per cui FolderClean non funziona dopo aver cancellato i file copiati.

5. Come fai a sapere che il file non è aperto dopo la copia? Non è stato aperto esplicitamente dalla funzione FileOpen, ma è stato copiato con, il che significa che è aperto. Quindi rimane aperto dopo la copia e anche dopo la cancellazione. Probabilmente.

Motivazione: