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

 
Rashid Umarov:

Pour une raison quelconque, le système d'exploitation ne permet pas de supprimer le fichier - soit il est ouvert par un autre programme, soit il n'est pas suffisamment autorisé.

Exactement comme ça. Lorsque j'essaie de supprimer un dossier qui contient déjà des sous-dossiers et des fichiers, je supprime d'abord les fichiers. Seuls les sous-dossiers restent. J'essaie de les nettoyer en utilisant FolderClean() puis j'appelle FolderDelete(). Cependant, le résultat est que les sous-dossiers qui étaient vides sont bien supprimés, mais s'il y avait plus de sous-dossiers à l'intérieur des sous-dossiers, ils ne sont pas supprimés. Ensuite, j'essaie de supprimer manuellement les dossiers du navigateur de fichiers dans MetaEditor, mais le terminal ne les supprime pas et fait apparaître cette fenêtre :

Je clique sur "Continuer", j'accepte les modifications, mais le dossier n'est toujours pas effacé. Après avoir complètement fermé et rouvert le terminal, les dossiers qui auraient dû être effacés disparaissent d'eux-mêmes ou non, mais vous pouvez les effacer immédiatement et manuellement sans la fenêtre ci-dessus.

De telles bizarreries...

 
Vladimir Karputov:

Ce que je devais prouver : le vieux terminal NE VOIT PAS les programmes MQL5. Vous essayez d'ouvrir le sandbox d'un autre fichier dans un script MQL5.

Les fonctions fonctionnent de manière identique sur les deux terminaux. Le bac à sable de fichiers du terminal dans lequel le script est exécuté est utilisé. Ce sont les fichiers natifs du terminal utilisé. Croyez-moi, ce n'est absolument pas un problème...
 
Rashid Umarov:


PS Et en général, ne pas donner les logs du programme revient à forcer les autres à deviner par le marc de café.

Jetez un coup d'œil à ce gif :



J'ai donné le code de ce script ci-dessus, à la page précédente.

 

Je dois ajouter que les dossiers que j'essaie d'effacer d'abord par logiciel, puis manuellement, ne sont ouverts nulle part. De plus, ils ne peuvent être ouverts que dans le navigateur de fichiers de MetaEditor, car ils sont vides et leurs fichiers ont été effacés. Les fichiers effacés n'ont été ouverts nulle part non plus.

La fenêtre demandant l'approbation de l'administrateur pour effacer manuellement les dossiers dans le navigateur de fichiers de MetaEditor n'apparaît que lorsqu'on essaie d'effacer les dossiers que le programme a essayé d'effacer en utilisant FolderClean() et FolderDelete() précédemment. Cette fenêtre n'apparaît jamais lorsqu'on essaie de supprimer d'autres dossiers.

 
Реter Konow:

Pourquoi la fonction FolderClean() de ce script échoue-t-elle ?

La tentative de nettoyage d'un dossier entraîne l'erreur 5026 - (le dossier ne peut pas être nettoyé).

Ce script est tiré de la documentation ( section de la fonction FolderDelete()) et légèrement modifié. Pour supprimer complètement un dossier qui contient d'autres sous-dossiers ou fichiers, vous devez le vider. Un appel à FolderClean() est ajouté à cet effet.

Puis-je demander pourquoi il n'y a pas de fermeture de dossier ? Ou est-ce que je ne le vois pas ?

Voici un extrait de votre code, de l'ouverture du fichier à la demande de suppression...

   handle=FileOpen(filepath,FILE_WRITE|FILE_TXT); // флаг FILE_WRITE в данном случае обязателен, см. справку к функции FileOpen 
   if(handle!=INVALID_HANDLE) 
      PrintFormat("Открыли файл на чтение %s",working_folder+"\\"+filepath); 
   else 
      PrintFormat("Не удалось создать файл %s в папке %s. Код ошибки=",filename,secondFolder, GetLastError());
 
   Comment(StringFormat("Готовимся удалить папки %s и %s", firstFolder, secondFolder)); 
//--- Небольшая пауза в 5 секунд, чтобы мы могли прочитать сообщение на графике 
   Sleep(5000); // Sleep() нельзя использовать в индикаторах!
 
//--- выведем диалоговое окно и просим пользователя 
 
Alexey Viktorov:

Puis-je demander pourquoi il n'y a pas de fermeture du dossier ? Ou est-ce que je ne le vois pas ?

Voici un extrait de votre code, de l'ouverture du fichier à la question sur la suppression...

Pour autant que je sache, si aucune modification n'a été apportée au fichier à l'aide des fonctions de fichier (par exemple, FileWrite()), il n'est pas nécessaire de le fermer. La fonction FileOpen() crée simplement un nouveau fichier et cette opération ne nécessite pas la fermeture du fichier (la documentation de cette fonction ne précise pas non plus que le fichier doit être fermé après sa création). De plus, ce script est tiré de la documentation et je n'y ai rien changé. Je viens d'ajouter des lignes avec la fonction FolderClean().
 
Реter Konow:
Pour autant que je sache, si aucune modification n'a été apportée au fichier à l'aide de FileWrite(), il n'est pas nécessaire de le fermer. La fonction FileOpen() crée simplement un nouveau fichier et cette opération ne nécessite pas la fermeture du fichier. De plus, ce script est tiré de la documentation et je n'y ai rien changé. J'ai juste ajouté des lignes avec la fonction FolderClean().

Mais si vous regardez le code à l'aide du débogueur, vous verrez qu'immédiatement après l'exécution de FileOpen(), il y a un fichier de taille nulle sur le disque. Et la documentation contient de nombreuses erreurs et imprécisions.

 
Alexey Viktorov:

Mais si vous parcourez le code avec le débogueur, il y a un fichier de taille zéro sur le disque juste après l'exécution de FileOpen(). Et la documentation contient de nombreuses erreurs et imprécisions.

Il devrait donc être de taille zéro pour cet exemple.

Je vais maintenant essayer de fermer explicitement le fichier dans le script et réessayer.

 
Реter Konow:

Il devrait donc être de taille zéro pour cet exemple.

Je vais essayer de fermer explicitement le fichier dans le script et réessayer.

Je regarde rarement les exemples de codes, et j'ai supprimé le dossier sans aucun problème. Donc 99% sûr que c'est le problème.
 

Le résultat est le même.

Voici le nouveau code :

//+------------------------------------------------------------------+ 
//|                                            Demo_FolderDelete.mq5 | 
//|                        Copyright 2011, MetaQuotes Software Corp. | 
//|                                              https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "Copyright 2011, MetaQuotes Software Corp." 
#property link      "https://www.mql5.com" 
#property version   "1.00" 
//--- описание 
#property description "Скрипт показывает пример использования FolderDelete()." 
#property description "Сначала создаются две папки, одна пустая, другая содержит файл." 
#property description "При попытке удаления непустой папки получим ошибку и предупреждение."
 
//--- покажем окно входных параметров при запуске скрипта 
#property script_show_inputs 
//--- входные параметры 
input string   firstFolder="empty";    // пустая папка 
input string   secondFolder="nonempty";// папка, в которой будет один файл 
string filename="delete_me.txt";       // имя файла, который мы создадим в папке secondFolder 
//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart() 
  { 
//--- хендл файла запишем сюда 
   int handle; 
//--- выясним в какой папке мы работаем 
   string working_folder=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL4\\Files"; 
//--- отладочное сообщение    
   PrintFormat("working_folder=%s",working_folder); 
//--- попытка создать пустую папку относительно пути MQL4\Files 
   if(FolderCreate(firstFolder,0)) // 0 означает, что работаем в локальной папке терминала 
     { 
      //--- выведем полный путь до созданной папки 
      PrintFormat("Cоздали папку %s",working_folder+"\\"+firstFolder); 
      //--- сбросим код ошибки 
      ResetLastError(); 
     } 
   else 
      PrintFormat("Не удалось создать папку %s. Код ошибки %d",working_folder+"\\"+firstFolder, GetLastError());
 
//--- теперь создадим непустую папку с помощью функции FileOpen() 
   string filepath=secondFolder+"\\"+filename;  // сформируем путь для файла, который хотим открыть на запись в несуществующей папке 
   handle=FileOpen(filepath,FILE_WRITE|FILE_TXT); // флаг FILE_WRITE в данном случае обязателен, см. справку к функции FileOpen 
   if(handle!=INVALID_HANDLE) 
     {
//*************************************************************************     
   //---- Явно закрываем файл.   
      FileClose(handle);
//*************************************************************************           
      PrintFormat("Открыли файл на чтение %s",working_folder+"\\"+filepath); 
     } 
   else 
      PrintFormat("Не удалось создать файл %s в папке %s. Код ошибки=",filename,secondFolder, GetLastError());
 
   Comment(StringFormat("Готовимся удалить папки %s и %s", firstFolder, secondFolder)); 
//--- Небольшая пауза в 5 секунд, чтобы мы могли прочитать сообщение на графике 
   Sleep(5000); // Sleep() нельзя использовать в индикаторах!
 
//--- выведем диалоговое окно и просим пользователя 
   int choice=MessageBox(StringFormat("Удалить папки %s и %s?", firstFolder, secondFolder), 
                         "Удаление папок", 
                         MB_YESNO|MB_ICONQUESTION); //  будут две кнопки - "Yes" и "No"
 
//--- выполним действия в зависимости от выбранного варианта 
   if(choice==IDYES) 
     { 
      //--- очистим комментарий на графике 
      Comment(""); 
      //--- выведем сообщение в журнал "Эксперты" 
      PrintFormat("Пробуем удалить папки %s и %s",firstFolder, secondFolder); 
      ResetLastError(); 
      //--- удаляем пустую папку 
      if(FolderDelete(firstFolder)) 
         //--- должны увидеть это сообщение, так как папка пустая 
         PrintFormat("Папка %s успешно удалена",firstFolder); 
      else 
         PrintFormat("Не удалось удалить папку %s. Код ошибки=%d", firstFolder, GetLastError());
 
      ResetLastError(); 

   //***********************************************************************************************************************   
      //--- сначала очищаем папку
      if(FolderClean(secondFolder))
         PrintFormat("Папка %s успешно очищена", secondFolder);
      else 
         //---  
         PrintFormat("Не удалось очистить папку %s. Код ошибки=%d", secondFolder, GetLastError());
   //***********************************************************************************************************************   
   
      ResetLastError(); 
        
      //--- удаляем папку, которая содержит файл               
      if(FolderDelete(secondFolder)) 
         PrintFormat("Папка %s успешно удалена", secondFolder); 
      else 
         //--- 
         PrintFormat("Не удалось удалить папку %s. Код ошибки=%d", secondFolder, GetLastError()); 
     }  

   else 
      Print("Удаление отменено"); 
//--- 
  }
Raison: