このスクリプトの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()の呼び出しが追加されています。
このスクリプトのFolderClean()関数が失敗するのはなぜですか?
フォルダをクリアしようとすると、エラー5026 - (folder cannot be cleared)が発生します。
このスクリプトは、ドキュメント(FolderDelete()関数の セクション)から引用し、若干の修正を加えています。他のサブフォルダーやファイルを含むフォルダーを完全に削除するには、そのフォルダーをクリアする必要があります。そのためにFolderClean()の呼び出しが追加されています。
他人のサンドボックスに(MQL4で)入ろうとするのは気にならないのでしょうか?
他人のサンドボックスに(MQL4で)入り込もうとするのは、混乱しませんか?
よくわからないんですけど。どういうことですか?実験はMT4で行いました。
備考
セキュリティ上の理由から、MQL5言語では、ファイルに対する操作を厳密に制御しています。MQL5言語を使って扱うファイルは、ファイル「サンドボックス」の外には出られません。
クライアントターミナルフォルダのサブフォルダMQL5Files(テストの場合は_agent_testing_directory_MQL5Files)にファイルがオープンされます。フラグに FILE_COMMON を指定すると、全クライアント端末の共通フォルダである \TerminalCommonFiles にファイルをオープン します。
備考
セキュリティ上の理由から、MQL5言語では、ファイルに対する操作を厳密に制御しています。MQL5言語を使って扱うファイルは、ファイル「サンドボックス」の外には出られません。
クライアントターミナルフォルダのサブフォルダMQL5Files(テストの場合は_agent_testing_directory_MQL5Files)にファイルがオープンされます。フラグに FILE_COMMON を指定すると、全クライアント端末の共通フォルダ ⇄TerminalCommonFiles にファイルが 開きます。
このスクリプトは、ドキュメントから引用しています。
ここでは、フォルダーが作成されるまでの軌跡を紹介します。
string working_folder=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL4\\Files";
FolderDelete()関数の一部が動作し、空になったフォルダを消去します。ただし、ファイル付きのフォルダーは、フォルダー内にファイルが存在するため、FolderDelete()関数が動作しなくなり、最初に消去する必要があります。それを消去するために、説明書通りにFolderClean()の呼び出しを追加しました。しかし、FolderClean()関数が何らかの理由で失敗し、ファイルのあるフォルダーがクリアされない。そのため、FolderDelete()で消去されることはない。
備考
セキュリティ上の理由から、MQL5言語では、ファイルに対する操作を厳密に制御しています。MQL5言語を使って扱うファイルは、ファイル「サンドボックス」の外には出られません。
クライアントターミナルフォルダのサブフォルダMQL5Files(テストの場合は_agent_testing_directory_MQL5Files)にファイルがオープンされます。フラグに FILE_COMMON を指定すると、全クライアント端末の共通フォルダ ⇄TerminalCommonFiles にファイルが 開きます。
コードがMQL4であろうとMQL5であろうと違いはありません。このスクリプトのコードは、どちらのプラットフォームでも同じように動作します。MT4でテストしてみました。
旧ターミナルでMQL5のコードを実行しましたか?確認させてください.
旧ターミナルでMQL5のコードを実行しましたか?確認させてください.
信じてください、何の問題もないんです。
古い端末ではMQL5のプログラムを見ることができないことを証明する必要があったのです。MQL5スクリプトで 他人のファイルサンドボックスを開こうとしている。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索