Un dossier n'est pas supprimé s'il contient des fichiers non fermés. - page 7

 

Demain, j'essaierai de faire un script qui reproduit entièrement ce problème.

Pour que les gens ne disent pas que je fais de la "fiction" ici).

Merci beaucoup à tous pour votre volonté d'aider et votre assistance dans la résolution de ce problème. ))

 

Il y avait une erreur flottante comme celle-ci (la séquence est décrite et un fichier .ex5 de bibliothèque a été joint). Il est difficile de documenter ce genre de chose

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Bugs, bugs, questions

A100, 2016.08.04 00:05

Erreur d'ouverture du fichier par l'Expert Advisor. Et si par exemple.

1. supprimer "certains codes non pertinents" (voir ci-dessous)

2. ou supprimer ::Sleep(1000)

il n'y a pas d'erreur

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

Séquence d'actions :

1. Créez un nouveau profil (par exemple, "Test").

2. ouvrez deux nouveaux graphiques en attachant le conseiller expert Test.ex5 à chacun d'eux (voir image)

4. Sélectionnez un autre profil existant

5. Sélectionnez le profil "Test".

résultat :

Alors que Test001.mq5 ressemble à ceci :

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

J'ai maintenant essayé avec le fichier de bibliothèque joint : le résultat est le même (le fichier de test est ouvert séparément par les deux EA, et s'il est ouvert simultanément, l'une des EA signale une erreur).
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


 

J'ai trouvé le numéro de demande #1530548, mais aucun commentaire - il se peut qu'il ait déjà été corrigé. Si ce n'est pas le cas, veuillez réexaminer la situation

 

Реter Konow:

Lefichier est ouvert par mon application (navigateur de fichiers) pour être écrasé dans un autre dossier.

Lorsque le fichier est ouvert à la lecture , nous obtenons l'identifiant du fichier.

L'étiquette est Konow:

Après l'écrasement, je dois fermer le fichier mais je ne peux pas (pas de poignée) et j'efface simplement le fichier.

Pour écrire dans un autre fichier, j'ai besoin du handle de cet autre fichier, il est donc logique de le stocker dans une autre variable. Après avoir écrit dans un nouveau fichier, les handles des deux fichiers sont stockés dans deux variables, et les deux fichiers sont fermés en utilisant ces handles.

Tag Konow:

Il n'y a pas de poignée car le fichier a été créé on ne sait pas quand et par qui.

Si le fichier a été créé par John Doe et John Doe, il est TRÈS probable qu'il ne soit utilisé par aucune application. Si vous ouvrez le fichier dans un but quelconque, vous disposez alors déjà d'un handle obtenu par la fonction FileOpen et vous devez le fermer avant d'effacer le dossier.

Tag Konow:

Cela dit, le fichier existe dans le dossier Files et peut être copié dans un autre dossier, puis effacé.

Lors de la copie d'un fichier d'un programme accessible à un programme mql, le handle du fichier est totalement inutile.

Reg Konow:

Mais vous ne pouvez pas fermer ce fichier après l'avoir copié. Il n'y a pas de poignée.

Après avoir copié le fichier, le fichier n'est pas ouvert et il n'est pas nécessaire de le fermer.

Tag Konow:

C'est probablement la raison pour laquelle l'effacement supplémentaire de FolderClean() avec des fichiers effacés, ne fonctionne pas.

C'est une erreur absolue.

RetagKonow:

Question : Comment puis-je obtenir un handle sur ce fichier dans un programme MQL ?

D'après ce qui précède, cette question n'a pas de sens. Un handle de fichier n'est obtenu que lorsqu'un fichier est ouvert pour déterminer où le pointeur de fichier FileTell et FileSeek doit être lu ou écrit, vidé de force sur le disque par FileFlush et, bien sûr, fermé afin de libérer le fichier pour que d'autres applications puissent y travailler.


C'est par hasard que j'ai découvert quel est votre problème :

Pendant une expérience, un dossier est ouvert dans l'Explorateur ou un autre gestionnaire de fichiers pour surveiller la création et la suppression d'un fichier. Et une fois que le fichier est supprimé, le dossier reste occupé et ne peut pas être supprimé. Le résultat est

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

Mais le fait qu'après une tentative infructueuse de suppression d'un dossier, ce dossier reste occupé, hélas, est un fait. Cela va maintenant faire l'objet d'une demande auprès du SD.

ps ; Hélas, j'ai aussi fait une erreur pendant l'expérience. Après avoir écrit dans le fichier, réinitialiser les données sur le disque, a essayé de l'ouvrir avec le bloc-notes, mais a obtenu en réponse ... (figure) pour annuler la tentative d'ouvrir oublié et c'est ce qui a gardé le dossier et n'a pas laissé être supprimé.

Résumé : aucun problème avec les fichiers mql.

 

Alexey Viktorov:

Tout à fait par hasard, j'ai découvert quel est votre problème :

Pendant une expérience, un dossier est ouvert dans l'Explorateur ou un autre gestionnaire de fichiers pour surveiller la création et la suppression d'un fichier. Et après avoir supprimé le fichier, le dossier reste occupé et ne peut pas être supprimé. Le résultat est

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

Mais le fait qu'après une tentative infructueuse de suppression d'un dossier, ce dossier reste occupé, hélas, est un fait. Ceci sera maintenant rapporté au SR.

J'ai rencontré ce comportement dans des circonstances complètement différentes - également en gardant un dossier ouvert pour la suppression, ce qui fait que les programmes/scripts/SVN etc. ne parviennent pas à supprimer ce dossier.

Et le remède est toujours le même : démolir manuellement ce dossier. Il ne s'agit donc pas d'un problème de terminal ou d'éditeur.

 
Rashid Umarov:

J'ai rencontré ce comportement dans des circonstances complètement différentes - également en gardant un dossier ouvert pour la suppression, avec pour résultat que les programmes/scripts/SVN etc. ne pouvaient pas supprimer le dossier.

Et il est toujours traité de la même manière - en détruisant manuellement le dossier en question. Il ne s'agit donc pas d'un problème de terminal ou d'éditeur.

J'ai complété mon post un peu plus tard.

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Ne pas supprimer un dossier s'il contient des fichiers non fermés

Alexey Viktorov, 2017.08.29 08:55


ps ; Hélas, je me suis aussi trompé pendant l'expérience. Après avoir écrit dans le fichier, réinitialisé les données sur le disque, j'ai essayé de l'ouvrir avec le bloc-notes, mais j'ai obtenu en réponse ...(figure) pour annuler la tentative d'ouverture que j'ai oublié et c'est ce qui a gardé le dossier et n'a pas permis de le supprimer.

Résumé : aucun problème avec les fichiers mql.


Il est étrange que vous ayez cité mon message sans cet addendum.

 
Alexey Viktorov:

J'ai complété mon post un peu plus tard.


Il est étrange que vous ayez cité mon message sans cet ajout.

Juste pour que vous soyez préparé à la réponse du SD.

 
Rashid Umarov:

Juste pour que vous soyez préparé à la réponse de la DS.

Donc si j'ai compris la raison du problème, pourquoi écrire de la merde à partir de la SD ? Je n'ai juste pas dit à voix haute que je refusais de l'écrire... Je pensais que c'était évident pour tout le monde.
 
Rashid Umarov:

J'ai rencontré ce comportement dans des circonstances complètement différentes - également en gardant un dossier ouvert pour la suppression, ce qui fait que les programmes/scripts/SVN etc. ne peuvent pas supprimer le dossier.

Et le remède est toujours le même : démolir manuellement ce dossier. Il ne s'agit donc pas d'un problème de terminal ou d'éditeur.

Et le fait d'ouvrir un dossier dans un gestionnaire de fichiers, PAS un FICHIER, n'affecte pas sa suppression par mql.

 
Alexey Viktorov:

1. Lors de l'ouverture d' un fichier pour la lecture , il faut obtenir l'identifiant du fichier.

2. Pour écrire dans un autre fichier, nous avons besoin d'un autre identifiant de fichier, il est donc raisonnable de le stocker dans une autre variable. Après avoir écrit dans un nouveau fichier, les handles des deux fichiers sont stockés dans deux variables, et les deux fichiers sont fermés en fonction de ces handles.

3. si le fichier a été créé à une date inconnue et par une personne inconnue, il y a une TRÈS bonne chance que le fichier ne soit pas occupé par une application. Si vous ouvrez le fichier dans un but quelconque, vous avez déjà un handle FileOpen et devez le fermer avant de vider le dossier.

4. Lors de la copie d'un fichier d'un programme disponible vers le mql, le handle du fichier est absolument inutile.

5. Une fois qu'un fichier est copié, ce fichier n'est plus ouvert et il n'est pas nécessaire de le fermer.


1 La poignée n'est nécessaire que pour la fonction FileClose. Je n'ouvre pas le fichier. Il a été créé avant moi. Je ne fais que le copier et l'effacer. Je ne peux pas le fermer car il n'y a pas de poignée.

2. Pour copier (FileCopy), pour déplacer (FileMove), l'identifiant du fichier n'est pas nécessaire. Veuillez vous référer à la documentation.

3) Si j'ouvre un fichier créé par quelqu'un d'autre à l'aide de la fonction FileOpen, je n'obtiendrai pas son identifiant. On ne sait pas du tout quelle poignée je vais recevoir. Il peut s'agir du sien ou d'un tout autre. J'ai essayé d'obtenir le handle du fichier de quelqu'un d'autre pour pouvoir le fermer FileClose après l'opération de copie. Ça n'a pas marché.

4. Lors de la copie, la poignée n'est pas nécessaire. Il est copié sans aucun problème. Mais le fichier est automatiquement ouvert pour être copié. De plus, je ne peux pas le fermer avec FileClose car il n'y a pas de poignée. C'est probablement la raison pour laquelle FolderClean ne fonctionne pas après avoir effacé les fichiers copiés.

5. Comment savez-vous que le fichier n'est pas ouvert après la copie ? Il n'a pas été explicitement ouvert par la fonction FileOpen, mais il a été copié avec, ce qui signifie qu'il est ouvert. Il reste donc ouvert après la copie et même après l'effacement. Probablement.