STARIJ Ich bin zu faul, um das zu überprüfen, aber wenn Sie die FILE_SHARE_READ- undFILE_SHARE_WRITE-Flags ausprobieren
Die Sache ist die, dass es unklar ist, was diese Flags mit FolderClean() zu tun haben. Meiner Meinung nach überhaupt nicht.
Ich möchte beweisen, dass es gar nicht um die Datei geht. Ich werde das Skript so umgestalten, dass es einen Ordner "DeleteMe.txt" anstelle des Ordners "notempty" erstellt und dann diesen Ordner löscht, genau wie es zuvor mit der Datei versucht hat. Mal sehen, ob es einen Unterschied macht).
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
Ich muss sagen, dass es tatsächlich funktioniert, die Datei explizit zu schließen. Ich schätze, ich habe mich geirrt. Beim ersten Mal hat es nicht funktioniert, wahrscheinlich weil ich keine neue Version des umgestalteten Skripts gespeichert habe und die explizite Schließung nicht wirksam wurde.
Dann wurde die Dateierstellung wieder hinzugefügt. Ergebnis: Ohne die Datei explizit zu schließen, wird der Ordner nicht wie bisher vom Skript gelöscht. Beim expliziten Schließen der Datei wird diese vollständig gelöscht.
Natürlich erklärt diese Erfahrung nicht alles, und einige Dinge bleiben vorerst unklar, aber dieses Ergebnis ist inspirierend.
Ich werde weiter testen und über die Ergebnisse berichten.
Möglicherweise gibt es noch Probleme, und es ist schwer, das im Moment mit Sicherheit zu sagen.
Hier ist der Code des Skripts, das sowohl die Datei "DeleteMe.txt" als auch die Datei "DeleteMe Folder" erstellt. Die Datei wird sofort nach der Erstellung explizit geschlossen.
Alles scheint zu funktionieren...
//+------------------------------------------------------------------+ //| 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("Удаление отменено");
//---
}
Natürlich erklärt diese Erfahrung nicht alles, und einige Dinge bleiben bis jetzt vage, aber dieses Ergebnis ist inspirierend.
Ich werde weitere Tests durchführen und über die Ergebnisse berichten.
Es kann immer noch Probleme geben, und es ist schwer, das im Moment mit Sicherheit zu sagen.
Ja, natürlich können Sie das, und behalten Sie die Details für sich, sagen Sie einfach: "Ich habe das Beispiel aus der Hilfe geändert, überhaupt nichts".
Und wir werden weiter raten - denn mit Protokollen kann jeder raten, und das ist viel interessanter.
Ich erinnere mich an Ihr "Ich habe alle Züge aufgeschrieben" im Thread OOP vs. prozedurale Programmierung. In diesem Thread war ich einfach überzeugt, dass man Ihnen nicht trauen kann.
Es gibt keine Beweise und keine Einzelheiten - es besteht keine Notwendigkeit, sich an den Kundendienst zu wenden.
Ich meine, haben Sie einen EA aus einem Skript erstellt und versucht, ihn auszuführen?
Die Sache ist die, dass es unklar ist, was diese Flags mit FolderClean() zu tun haben. Meiner Meinung nach überhaupt nicht.
Ich möchte beweisen, dass es gar nicht um die Datei geht. Ich werde das Skript so umgestalten, dass es einen Ordner "DeleteMe.txt" anstelle des Ordners "notempty" erstellt und dann diesen Ordner löscht, genau wie es zuvor mit der Datei versucht hat. Mal sehen, ob es einen Unterschied macht).
Die Sache ist die, dass es unklar ist, was diese Flags mit FolderClean() zu tun haben. Meiner Meinung nach überhaupt nicht.
ein Ordner kann gelöscht werden, wenn er keine Dateien enthält oder wenn er entfernt werden kann. Diese Flags erlauben den Zugriff auf die Datei
Ich meine, haben Sie einen EA aus einem Skript erstellt und versucht, ihn auszuführen?
Wo habe ich gesagt, dass ich einen EA gemacht habe?
Ich muss sagen, dass es tatsächlich funktioniert, die Datei explizit zu schließen. Ich schätze, ich habe mich geirrt. Beim ersten Mal hat es nicht funktioniert, wahrscheinlich weil ich keine neue Version des umgestalteten Skripts gespeichert habe und die explizite Schließung nicht wirksam wurde.
Jetzt habe ich versucht, Ordner statt einer Datei zu erstellen. Sie wurden ohne Probleme gelöscht.
Dann wurde die Dateierstellung wieder hinzugefügt. Ergebnis: Ohne die Datei explizit zu schließen, wird der Ordner nicht wie bisher vom Skript gelöscht. Beim expliziten Schließen der Datei wird diese vollständig gelöscht.
Natürlich erklärt diese Erfahrung nicht alles, und einige Dinge bleiben vorerst unklar, aber dieses Ergebnis ist inspirierend.
Ich werde weiter testen und über die Ergebnisse berichten.
Möglicherweise gibt es noch Probleme, und es ist schwer, das im Moment mit Sicherheit zu sagen.
Wo habe ich gesagt, was das Ratsmitglied getan hat?
Hier ist der Code des Skripts, das sowohl die Datei "DeleteMe.txt" als auch die Datei "DeleteMe Folder" erstellt. Die Datei wird sofort nach der Erstellung explizit geschlossen.
Alles scheint zu funktionieren...
Natürlich erklärt diese Erfahrung nicht alles, und einige Dinge bleiben bis jetzt vage, aber dieses Ergebnis ist inspirierend.
Ich werde weitere Tests durchführen und über die Ergebnisse berichten.
Es kann immer noch Probleme geben, und es ist schwer, das im Moment mit Sicherheit zu sagen.
Ja, natürlich können Sie das, und behalten Sie die Details für sich, sagen Sie einfach: "Ich habe das Beispiel aus der Hilfe geändert, überhaupt nichts".
Und wir werden weiter raten - denn mit Protokollen kann jeder raten, und das ist viel interessanter.
Ja, natürlich, schreiben Sie. Und die Details behalten Sie für sich, sagen Sie einfach: "Ich habe ein kleines Beispiel der Hilfe geändert, gar nichts.
Und wir werden weiter raten - denn bei Protokollen kann jeder raten, und das ist viel interessanter.
Seltsam. Es ist nichts Persönliches. Wenn ich unprofessionell bin, tut es mir leid. Ich werde es lernen.
Vielen Dank für Ihre Hilfe.
P.S. Ich habe noch nie im Forum um Hilfe gebeten. Daher auch die Unerfahrenheit.
Ich erinnere mich an Ihr "Ich habe alle Züge aufgeschrieben" im Thread OOP vs. prozedurale Programmierung. In diesem Thread war ich einfach überzeugt, dass man Ihnen nicht trauen kann.
Es gibt keine Beweise und keine Einzelheiten - es besteht keine Notwendigkeit, sich an den Kundendienst zu wenden.