閉じていないファイルがある場合、フォルダは削除されない

 
サービスデスクで開発者とコミュニケーション!」に関連するコメントはありません。".
 

このスクリプトのFolderClean()関数が失敗するのはなぜですか?

//+------------------------------------------------------------------+ 
//|                                            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) 
      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("Удаление отменено"); 
//--- 
  }

フォルダーをクリーニングしようとすると、エラー5026 - (フォルダーをクリーニングできません)が発生します。

このスクリプトは、ドキュメント(FolderDelete()の セクション)から引用し、若干の修正を加えたものです。他のサブフォルダーやファイルを含むフォルダーを完全に削除するには、そのフォルダーをクリアする必要があります。そのためにFolderClean()の呼び出しが追加されています。

 
Реter Konow:

このスクリプトのFolderClean()関数が失敗するのはなぜですか?

フォルダをクリアしようとすると、エラー5026 - (folder cannot be cleared)が発生します。

このスクリプトは、ドキュメント(FolderDelete()関数の セクション)から引用し、若干の修正を加えています。他のサブフォルダーやファイルを含むフォルダーを完全に削除するには、そのフォルダーをクリアする必要があります。そのためにFolderClean()の呼び出しが追加されています。


他人のサンドボックスに(MQL4で)入ろうとするのは気にならないのでしょうか?

 
Vladimir Karputov:

他人のサンドボックスに(MQL4で)入り込もうとするのは、混乱しませんか?

よくわからないんですけど。どういうことですか?私はMT4で体験を行いました。
 
Реter Konow:
よくわからないんですけど。どういうことですか?実験はMT4で行いました。

FileOpen

備考

セキュリティ上の理由から、MQL5言語では、ファイルに対する操作を厳密に制御しています。MQL5言語を使って扱うファイルは、ファイル「サンドボックス」の外には出られません。

クライアントターミナルフォルダのサブフォルダMQL5Files(テストの場合は_agent_testing_directory_MQL5Files)にファイルがオープンされます。フラグに FILE_COMMON を指定すると、全クライアント端末の共通フォルダである \TerminalCommonFiles にファイルをオープン します。

MQL5のコードを実行している場合、古い端末はどうなるのでしょうか?
 
Vladimir Karputov:

FileOpen

備考

セキュリティ上の理由から、MQL5言語では、ファイルに対する操作を厳密に制御しています。MQL5言語を使って扱うファイルは、ファイル「サンドボックス」の外には出られません。

クライアントターミナルフォルダのサブフォルダMQL5Files(テストの場合は_agent_testing_directory_MQL5Files)にファイルがオープンされます。フラグに FILE_COMMON を指定すると、全クライアント端末の共通フォルダ ⇄TerminalCommonFiles にファイルが 開きます。

このスクリプトは、ドキュメントから引用しています。

ここでは、フォルダーが作成されるまでの軌跡を紹介します。

string working_folder=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL4\\Files"; 

FolderDelete()関数の一部が動作し、空になったフォルダを消去します。ただし、ファイル付きのフォルダーは、フォルダー内にファイルが存在するため、FolderDelete()関数が動作しなくなり、最初に消去する必要があります。それを消去するために、説明書通りにFolderClean()の呼び出しを追加しました。しかし、FolderClean()関数が何らかの理由で失敗し、ファイルのあるフォルダーがクリアされない。そのため、FolderDelete()で消去されることはない。

 
Vladimir Karputov:

FileOpen

備考

セキュリティ上の理由から、MQL5言語では、ファイルに対する操作を厳密に制御しています。MQL5言語を使って扱うファイルは、ファイル「サンドボックス」の外には出られません。

クライアントターミナルフォルダのサブフォルダMQL5Files(テストの場合は_agent_testing_directory_MQL5Files)にファイルがオープンされます。フラグに FILE_COMMON を指定すると、全クライアント端末の共通フォルダ ⇄TerminalCommonFiles にファイルが 開きます。

MQL5のコードを実行する場合、旧端末とどのような関係があるのでしょうか?
MQL4でもMQL5でも差はない。このスクリプトのコードは、どちらのプラットフォームでも同じように動作します。MT4でテストしてみました。
 
Реter Konow:
コードがMQL4であろうとMQL5であろうと違いはありません。このスクリプトのコードは、どちらのプラットフォームでも同じように動作します。MT4でテストしてみました。

旧ターミナルでMQL5のコードを実行しましたか?確認させてください.

 
Vladimir Karputov:

旧ターミナルでMQL5のコードを実行しましたか?確認させてください.

信じてください、何の問題もないんです。
 
Реter Konow:
信じてください、何の問題もないんです。

古い端末ではMQL5のプログラムを見ることができないことを証明する必要があったのです。MQL5スクリプトで 他人のファイルサンドボックスを開こうとしている。

 

Реter Konow:

しかし、FolderClean()関数が何らかの理由で失敗し、ファイルのあるフォルダーがクリアされない。そのため、FolderDelete()で消去されることはない。

何らかの理由で、OSがファイルを削除 させてくれません。他のプログラムが開いているか、アクセス権がない可能性があります。

PS 一般に、プログラムのログを与えないことは、コーヒーのかすで他人に推測を強要していることになる