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

 
Rashid Umarov:

Je me souviens de votre "J'ai tous les mouvements écrits" dans le fil de discussion sur la programmation OOP vs procédurale. Dans ce fil de discussion, j'étais juste convaincu qu'on ne pouvait pas vous faire confiance.

Il n'y a pas de preuves ni de détails - il n'est pas nécessaire d'écrire au servicedesk.


Mon problème de suppression de dossiers n'est toujours pas résolu. Le script fonctionne, mais je n'ai pas encore trouvé la cause de mon problème.


Il y a toutes sortes de possibilités. C'est peut-être ou non de ma faute. Je suis toujours prêt à fournir les informations nécessaires pour résoudre le problème.


Ma réaction à servicedek n'est en aucun cas une plainte.

 
Rashid Umarov:

Je me souviens de votre "J'ai tous les mouvements écrits" dans le fil de discussion sur la programmation OOP vs procédurale. Dans ce fil de discussion, j'étais juste convaincu qu'on ne pouvait pas vous faire confiance.

Je ne sais pas de quels mouvements tu parles, et pourquoi tu penses qu'on ne peut pas me faire confiance. J'ai peut-être donné une raison de le faire, mais je ne me souviens pas exactement où ni quand.

Quoi qu'il en soit, je vous remercie d'avoir exprimé franchement votre attitude à mon égard. Il vaut mieux savoir que ne pas savoir.

 

J'espère que vous comprenez vraiment, vous avez fait un excellent travail de Conseils préjudiciables - comment ne pas écrire au Service Desk.

 
Rashid Umarov:

J'espère que vous avez bien compris, vous avez fait un excellent travail de Conseils préjudiciables - comment ne pas écrire au Service Desk.


Hélas, je ne l'ai pas eu. J'ai essayé d'être aussi clair et précis que possible dans mon message. J'ai donné des détails, donné un fichier gif, commenté le code du script. Alors qu'est-ce que j'ai fait de mal exactement ?

 

Vous ne pouvez vraiment pas lire l'aide et modifier le code correctement ? Comment pouvez-vous alors exiger une attitude différente ? Voici le code de l'aide, avec les ajouts surlignés en jaune.

//+------------------------------------------------------------------+
//|                                                Test_FileOpen.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- неправильный способ открытия файла
   string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);
   string filename=terminal_data_path+"\\MQL5\\Files\\"+"fractals.csv";
   int filehandle=FileOpen(filename,FILE_WRITE|FILE_CSV);
   if(filehandle<0)
     {
      Print("Неудачная попытка открыть файл по абсолютному пути");
      Print("Код ошибки ",GetLastError());
     }
//--- правильный способ работы в "файловой песочнице"
   ResetLastError();
   filehandle=FileOpen("fractals.csv",FILE_WRITE|FILE_CSV);
   if(filehandle!=INVALID_HANDLE)
     {
      FileWrite(filehandle,TimeCurrent(),Symbol(),EnumToString(_Period));
      FileClose(filehandle);
      Print("FileOpen OK");
     }
   else Print("Операция FileOpen неудачна, ошибка ",GetLastError());

//--- еще один пример с созданием вложенной директории в MQL5\Files\
   string subfolder="Research";
   filehandle=FileOpen(subfolder+"\\fractals.txt",FILE_WRITE|FILE_CSV);
   if(filehandle!=INVALID_HANDLE)
     {
      FileWrite(filehandle,TimeCurrent(),Symbol(),EnumToString(_Period));
      FileClose(filehandle);
      Print("Файл должен быть создан в папке "+terminal_data_path+"\\"+subfolder);
     }
   else Print("Операция FileOpen неудачна, ошибка ",GetLastError());
//---
   Print("Очищаем папку \\MQL5\\",subfolder);
   FolderClean(subfolder,1);

   Print("Удаляем папку \\MQL5\\",subfolder);
   if(!FolderDelete(subfolder,1))
      PrintFormat("Ошибка! Не удалось удалить папку  \\MQL5\\",subfolder);
  }
//+------------------------------------------------------------------+
 
Rashid Umarov:

Êtes-vous vraiment incapable de lire l'aide et de modifier le code correctement ? Comment pouvez-vous demander une attitude différente ? Voici le code de l'aide, avec les ajouts en jaune.

Si l'attitude à l'égard de ma personne dépend du fait que j'ai fait une erreur dans le code, alors j'ai bien peur que quelque chose ne tourne pas rond ici...))

Je ne comprends toujours pas vos revendications.

J'ai posté mon code modifié plus d'une fois sur le forum. Ma seule erreur est qu'après avoir ajouté la fermeture explicite du fichier, j'ai oublié de réenregistrer le script et n'ai donc pas vu que cela avait résolu le problème dans le script que j'ai modifié. Cependant, dans tous les cas, la documentation ne dit pas explicitement que vous devez fermer les fichiers après leur création.

Après cela, comme je l'ai déjà dit, mon problème d'effacement des dossiers (note pas des fichiers) est resté. Les dossiers ne contiennent plus de fichiers, mais la fonction FolderClean les efface.

La cause n'est pas encore claire.

Alors, peut-être que je suis allé au Service Desk pour une raison après tout.

Merci d'avoir pris le temps de considérer mon problème)).

 
Реter Konow:
Merci. Je suis content de ne pas être le seul à rencontrer ce problème. Je dois résoudre ce problème "par le sang" (je ne peux pas finir d'utiliser le navigateur de fichiers sans cela). J'ai écrit à Servicedeck. Mais j'écris ici aussi, juste au cas où. Il s'est avéré que ce n'était pas en vain).
fxsaber:

J'ai vu ce genre de chose se produire un certain nombre de fois. J'ai découvert qu'à un moment donné, le dossier Files, avec tous ses sous-dossiers et fichiers, obtient un attribut de lecture seule. Désélectionner ce drapeau manuellement n'aide pas. Mais redémarrer le terminal aide toujours. Je n'ai pas pu le faire jouer (je n'ai pas essayé), donc je ne l'ai pas signalé à SD.

Rejoindre. J'ai eu auparavant des pannes extrêmement rares depuis début 2014 qui ont généré une erreur OS "32 Sharing violation" dans 9 tentatives de création d'un fichier dans ce dossier, allant par incréments de 16 millisecondes à la suite. Je n'arrivais pas à comprendre ce qui n'allait pas. J'ai mis cela sur le compte de la "mise à niveau radicale des fonctions de traitement des fichiers" qui était en cours dans MQ à l'époque. Je ne peux pas non plus le reproduire, juste par coïncidence il y a eu ce problème à 20:12:42. Immédiatement, quelques secondes se sont écoulées, je suis allé dans un fichier de ce dossier, j'ai réussi à le modifier correctement et à l'enregistrer. Échec non rattrapé.

Avant ce crash se produisait une ou deux fois par mois pendant 5 ans, depuis février 2014 ça doit être chaque semaine, je ne compte pas combien de fois. Bien que le nombre de terminaux fonctionnant simultanément soit passé de 40-50 à 35.

 
Vladimir:

Accompagnement. J'ai eu une panne auparavant extrêmement rare depuis début 2014 qui a généré une erreur OS "32 Sharing violation" lors de 9 tentatives de création d'un fichier dans ce dossier, allant par incréments de 16 millisecondes à la suite. Je n'arrivais pas à comprendre ce qui n'allait pas. J'ai mis cela sur le compte de la "mise à niveau radicale des fonctions de traitement des fichiers" qui était en cours dans MQ à l'époque. Je ne peux pas non plus le reproduire, juste par coïncidence il y a eu ce problème à 20:12:42. Immédiatement, quelques secondes se sont écoulées, je suis allé dans un fichier de ce dossier, j'ai réussi à le modifier correctement et à l'enregistrer. Le problème n'est pas pris en charge.

Avant cela, pendant 5 ans cette erreur apparaissait une ou deux fois par mois, depuis février 2014 c'est invariablement toutes les semaines, je ne pourrais pas compter combien de fois. Bien que le nombre de terminaux fonctionnant simultanément soit passé de 40-50 à 35.

Tous mes fichiers sont effacés même sans les fermer explicitement. Effacés parce que je ne les ai pas créés et qu'ils étaient auparavant dans le dossier Files.

Le fait est que pour effacer un fichier, nous avons besoin de son identifiant. Cependant, si nous n'avons pas créé le fichier, mais l'avons seulement placé dans le dossier Files, nous ne pouvons pas obtenir son handle, et donc nous ne pouvons pas le fermer avec FileClose().

En même temps, nous pouvons toujours le copier ou l'effacer. Cependant, le dossier ne peut plus être supprimé après cela, que ce soit par programme ou manuellement. Manuellement, seulement après avoir redémarré le terminal.

J'essaierai de reproduire le problème plus clairement plus tard, avec des exemples clairs.

 
Реter Konow:

Tous les fichiers sont effacés, même sans les fermer explicitement. Effacés parce que je ne les ai pas créés et qu'ils étaient auparavant dans le dossier Files.

Le fait est que pour effacer un fichier, nous avons besoin de son identifiant. Cependant, si nous n'avons pas créé ce fichier, mais l'avons seulement placé dans le dossier Files, nous ne pouvons pas obtenir son handle, et donc nous ne pouvons pas le fermer avec FileClose().

En même temps, nous pouvons toujours le copier ou l'effacer. Cependant, le dossier ne peut plus être supprimé après cela, que ce soit par programme ou manuellement. Manuellement, seulement après avoir redémarré le terminal.

J'essaierai de reproduire le problème plus clairement plus tard, avec des exemples clairs.

C'est probablement le cœur du problème.

Lorsque je renomme un dossier dans le navigateur de fichiers personnalisé, je ne peux pas utiliser FolderRename() car il n'existe pas.

Au lieu de cela, je copie tous les fichiers et dossiers dans un nouveau dossier, avec un nom personnalisé, et je supprime les fichiers et dossiers d'origine du dossier d'origine (que je renomme). En conséquence, j'efface d'abord tous les fichiers du dossier d'origine (après les avoir copiés dans le nouveau dossier), puis j'utilise FolderClean() pour essayer de supprimer la hiérarchie de dossiers restante dans le dossier d'origine, qui est déjà vide. C'est là que l'erreur se produit. Certains dossiers sont effacés, mais un ou deux restent, tout comme le dossier source. Ensuite, j'essaie de l'effacer manuellement et cela échoue. Seul le redémarrage du terminal est utile.

 
Реter Konow:

C'est probablement le cœur du problème.

Lorsque je renomme un dossier dans le navigateur de fichiers personnalisé, je ne peux pas utiliser FolderRename() car il n'existe pas.

Au lieu de cela, je copie tous les fichiers et dossiers dans un nouveau dossier, avec un nom personnalisé, et je supprime les fichiers et dossiers originaux du dossier original (que je renomme). En conséquence, j'efface d'abord tous les fichiers du dossier d'origine (après les avoir copiés dans le nouveau dossier), puis j'utilise FolderClean() pour essayer de supprimer la hiérarchie des dossiers restants dans le dossier d'origine, qui est déjà vide. C'est là que l'erreur se produit. Certains dossiers sont effacés, mais un ou deux restent, tout comme le dossier source. Ensuite, j'essaie de l'effacer manuellement et cela échoue. Seul le redémarrage du terminal est utile.


Continuez, tant que vous écrivez dans le genre fascinant de la "fiction". Avec un peu de chance, à la page 40, vous serez passé au genre "littérature technique".

Raison: