STARIJЗачем переделывать? лень проверять, но если попробовать флаги FILE_SHARE_READ и FILE_SHARE_WRITE
Дело в том, что неизвестно, какое отношение эти флаги имеют к функции FolderClean(). На мой взгляд, - совершенно никакого.
Я хочу доказать, что дело совсем не файле. Я переделаю скрипт, чтобы вместо вложенного в папку "notempty" файла "DeleteMe.txt" он создавал папку "DeleteMe Folder" и далее, эту папку стирал, как до этого пытался сделать с файлом. Вот и посмотрим, будет ли разница.)
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
Должен сказать, что действительно, явное закрытие файла работает. Похоже я ошибался. Первый раз не сработало, наверное потому, что не сохранил новую версию переделанного скрипта и явное закрытие не вошло в силу.
Сейчас попробывал вместо файла создавать папки. Стираются без проблем.
Потом снова добавил создание файла. В результате: Без явного закрытия файла папка не стирается скриптом, как и прежде. С явным закрытием файла, стирается полностью.
Конечно, этот опыт не все объясняет и пока некоторые вещи остаются туманными, но данный результат вдохновляет.
Продолжу тестировать и буду сообщать о результатах.
Возможно, проблемы еще будут, и сейчас сказать однозначно сложно.
Вот код скрипта, который создает и файл "DeleteMe.txt" и "DeleteMe Folder". Файл явно закрывает сразу после создания.
Вроде все работает...
//+------------------------------------------------------------------+ //| 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("Удаление отменено");
//---
}
Всмысле Вы сделали из скрипта советник и попробовали его запустить?
Дело в том, что неизвестно, какое отношение эти флаги имеют к функции FolderClean(). На мой взгляд, - совершенно никакого.
Я хочу доказать, что дело совсем не файле. Я переделаю скрипт, чтобы вместо вложенного в папку "notempty" файла "DeleteMe.txt" он создавал папку "DeleteMe Folder" и далее, эту папку стирал, как до этого пытался сделать с файлом. Вот и посмотрим, будет ли разница.)
Дело в том, что неизвестно, какое отношение эти флаги имеют к функции FolderClean(). На мой взгляд, - совершенно никакого.
папка может быть удалена, если в ней отсутствуют файлы или их можно удалить. Эти флаги разрешают доступ к файлу
Всмысле Вы сделали из скрипта советник и попробовали его запустить?
Где я сказал что сделал советник?
Должен сказать, что действительно, явное закрытие файла работает. Похоже я ошибался. Первый раз не сработало, наверное потому, что не сохранил новую версию переделанного скрипта и явное закрытие не вошло в силу.
Сейчас попробывал вместо файла создавать папки. Стираются без проблем.
Потом снова добавил создание файла. В результате: Без явного закрытия файла папка не стирается скриптом, как и прежде. С явным закрытием файла, стирается полностью.
Конечно, этот опыт не все объясняет и пока некоторые вещи остаются туманными, но данный результат вдохновляет.
Продолжу тестировать и буду сообщать о результатах.
Возможно, проблемы еще будут, и сейчас сказать однозначно сложно.
Где я сказал что сделал советник?
Вот код скрипта, который создает и файл "DeleteMe.txt" и "DeleteMe Folder". Файл явно закрывает сразу после создания.
Вроде все работает...
Конечно, этот опыт не все объясняет и пока некоторые вещи остаются туманными, но данный результат вдохновляет.
Продолжу тестировать и буду сообщать о результатах.
Возможно, проблемы еще будут, и сейчас сказать однозначно сложно.
Да. конечно, пишите. И детали оставляйте при себе, просто говорите "я немного изменил пример из справки, совсем ничего"
А мы продолжим угадывать - ведь с логами любой догадается. А так гораздо интересней.
Да. конечно, пишите. И детали оставляйте при себе, просто говорите "я немного изменил пример из справки, совсем ничего"
А мы продолжим угадывать - ведь с логами любой догадается. А так гораздо интересней.
Странно. Ничего личного. Если я проявляю непроффесонализм, - простите. Буду учится.
Спасибо за содействие.
P.S. просто никогда не просил помощи на форуме. Отсюда и неопытность.
Я помню ваше "у меня все ходы записаны" в ветке ООП vs процедурное программирование . В этой ветке я лишь убедился, что верить вам нельзя.
Нет доказательств и деталей - не нужно писать в сервисдеск.