MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
//+------------------------------------------------------------------+ //| 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//--- входные параметры inputstring firstFolder="empty"; // пустая папка inputstring secondFolder="nonempty";// папка, в которой будет один файл string FolderName="delete_me Folder"; // имя файла, который мы создадим в папке secondFolder string filename="delete_me.txt"; // имя файла, который мы создадим в папке secondFolder //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ voidOnStart()
{
//--- хендл файла запишем сюда 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();
}
elsePrintFormat("Не удалось создать папку %s. Код ошибки %d",working_folder+"\\"+firstFolder, GetLastError());
//--- теперь создадим пустую папку с помощью функции FolderCreatestring filepath=secondFolder+"\\"+FolderName; // сформируем путь для файла, который хотим открыть на запись в несуществующей папке if(FolderCreate(filepath))
{
FolderCreate(filepath + "1");
PrintFormat("Открыли папку %s",working_folder+"\\"+filepath);
}
elsePrintFormat("Не удалось создать папку %s в папке %s. Код ошибки=",FolderName,secondFolder, GetLastError());
/**///--- теперь создадим файл с помощью функции FileOpen() string filepath_2=secondFolder+"\\"+filename; // сформируем путь для файла, который хотим открыть на запись в несуществующей папке
handle=FileOpen(filepath_2,FILE_WRITE|FILE_TXT); // флаг FILE_WRITE в данном случае обязателен, см. справку к функции FileOpen if(handle!=INVALID_HANDLE)
{
//************************************************************************* //---- Явно закрываем файл. FileClose(handle);
//************************************************************************* PrintFormat("Открыли файл на чтение %s",working_folder+"\\"+filepath_2);
}
elsePrintFormat("Не удалось создать файл %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);
elsePrintFormat("Не удалось удалить папку %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());
}
elsePrint("Удаление отменено");
//---
}
というか、スクリプトでEAを作って動かしてみましたか?
問題は、これらのフラグがFolderClean()とどのような関係があるのかが不明なことです。全然違う、と私は思っています。
ファイルとは全く関係ないことを証明したい。notempty」フォルダの代わりに「DeleteMe.txt」フォルダを作成し、このフォルダを以前のファイルで試みたように消去するようにスクリプトを作り直します。違いが出るかどうか見てみましょう)。
問題は、これらのフラグがFolderClean()とどのような関係があるのかが不明なことです。全然違う、と私は思っています。
は、フォルダ内にファイルがない場合、または削除可能な場合は、削除することができます。これらのフラグにより、ファイル
というか、スクリプトでEAを作って動かしてみましたか?
私がどこでEAを作ったと言いましたか?
確かに、明示的にファイルを閉じるとうまくいきますね。私が間違っていたようです。一度目はうまくいきませんでしたが、おそらく再設計したスクリプトの新しいバージョンを保存していなかったため、明示的なクロージャが有効にならなかったのだと思います。
今度は、ファイルではなく、フォルダを作成して みました。問題なく消去されました。
その後、再度ファイル作成を追加しました。結果:明示的にファイルを閉じないと、以前のようにスクリプトによってフォルダが消去されません。明示的にファイルを閉じると、完全に消去されます。
もちろん、この体験ですべてが説明できるわけではなく、今のところもやもやとしたものが残っていますが、この結果は感動的です。
今後もテストを続け、結果を報告する予定です。
まだ問題があるかもしれないし、今はまだ何とも言えない。
参議院がどうのこうのなんて、どこに書いてあるんだ?
以下は、「DeleteMe.txt」と「DeleteMe Folder」の両方のファイルを作成するスクリプトのコードです。 ファイルは作成後すぐに明示的に閉じられます。
すべてがうまくいっているように見えるが...。
もちろん、この体験ですべてが説明できるわけではなく、今のところ漠然としたものが残っていますが、この結果は感動的です。
今後もテストを続け、結果を報告する予定です。
まだ問題があるかもしれませんし、今のところ何とも言えません。
はい、もちろんできますし、詳細は伏せておいて、「ヘルプの例を変えただけで、まったく何もしていません」と言えばいいのです。
ログを使えば誰でも推測できますし、その方がずっと面白いですから。
もちろん、書いてください。 そして、詳細は自分自身の中に留めておいて、ただ「私はヘルプの例を少し変更しました、全く何もありません」と言うだけです。
ログがあれば誰でも推測できますし、そのほうがずっと面白いですから。
変なのです。個人的なことではないんです。もし、プロらしくない態度をとっていたら、ごめんなさい。勉強になります。
ご協力ありがとうございました。
P.S. 私は今までフォーラムで助けを求めたことがなかっただけです。それゆえ、未熟なのです。
OOP vs 手続き型プログラミングの スレッドで、あなたの「私はすべての手を書き留めている」という言葉を思い出しました 。 このスレッドで、あなたは信用できないと確信したところ です。
証拠も詳細もない。サービスデスクに書き込む必要はない。