handle=FileOpen(filepath,FILE_WRITE|FILE_TXT); // флаг FILE_WRITE в данном случае обязателен, см. справку к функции FileOpen if(handle!=INVALID_HANDLE)
PrintFormat("Открыли файл на чтение %s",working_folder+"\\"+filepath);
elsePrintFormat("Не удалось создать файл %s в папке %s. Код ошибки=",filename,secondFolder, GetLastError());
Comment(StringFormat("Готовимся удалить папки %s и %s", firstFolder, secondFolder));
//--- Небольшая пауза в 5 секунд, чтобы мы могли прочитать сообщение на графике Sleep(5000); // Sleep() нельзя использовать в индикаторах!//--- выведем диалоговое окно и просим пользователя
//+------------------------------------------------------------------+ //| 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 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());
//--- теперь создадим непустую папку с помощью функции FileOpen() string filepath=secondFolder+"\\"+filename; // сформируем путь для файла, который хотим открыть на запись в несуществующей папке
handle=FileOpen(filepath,FILE_WRITE|FILE_TXT); // флаг FILE_WRITE в данном случае обязателен, см. справку к функции FileOpen if(handle!=INVALID_HANDLE)
{
//************************************************************************* //---- Явно закрываем файл. FileClose(handle);
//************************************************************************* PrintFormat("Открыли файл на чтение %s",working_folder+"\\"+filepath);
}
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()清理它们,然后调用FolderDelete()。然而,结果是那些空的子文件夹被很好地删除了,但如果子文件夹里面有更多的子文件夹,则不会被删除。之后,我试图从MetaEditor的文件导航器中手动删除这些文件夹,但终端并没有删除它们,而是弹出这个窗口。
我点击 "继续",同意修改,但文件夹仍然没有被删除。在完全关闭并重新打开终端后,应该被删除的文件夹要么自己消失,要么不消失,但你可以在没有上述窗口的情况下立即手动删除它们。
这样的怪事...
我必须证明的是:旧的终端不能看到MQL5程序。你正试图在MQL5脚本 中打开别人的文件沙盒。
PS 一般来说--不给程序日志就是强迫别人用咖啡渣来猜。看一下这个GIF。
我在上面给出了这个脚本的代码,在上一页。
我应该补充的是,我试图先用软件擦除,然后手动擦除的文件夹并没有在任何地方打开。此外,除了MetaEditor中的文件导航器本身,它们不能在任何地方打开,因为它们是空的,其中的文件以前被删除了。被删除的文件也没有在任何地方被打开过。
要求管理员批准手动删除MetaEditor中的文件导航器中的文件夹的窗口,只在试图删除那些程序先前试图使用FolderClean() 和FolderDelete()删除的文件夹时出现。当试图删除其他文件夹时,这个窗口从未出现。
为什么这个脚本中的FolderClean()函数会失败?
试图清理一个文件夹的结果是错误5026--(文件夹不能被清理)。
这个脚本取自文档(FolderDelete()函数 部分)并稍作修改。要彻底删除一个包含其他子文件夹或文件的文件夹,你必须清除它。为此,增加了对FolderClean()的调用。
我可以问为什么没有文件关闭吗?还是我只是没有看到它?
下面是你从打开文件到要求删除的代码片段...
请问,为什么没有关闭文件?还是我只是没有看到它?
下面是你从打开文件到删除问题的代码片段...
据我所知,如果使用FileWrite()没有对文件进行修改,就没有必要关闭它。FileOpen()函数只是创建一个新的文件,这个操作并不要求关闭文件。此外,这个脚本取自文档,我没有在那里做任何改动。我只是用FolderClean()函数 添加了几行。
但如果你用调试器查看代码,你会发现在FileOpen()执行后,磁盘上立即出现了一个大小为空的文件。而且文件中存在相当多的错误和不准确之处。
但如果你用调试器查看代码,在FileOpen()执行后,磁盘上就有一个零大小的文件。而且文件中存在相当多的错误和不准确之处。
所以在这个例子中,它应该是零尺寸。
现在我将尝试在脚本中明确关闭该文件,然后再试一次。
所以在这个例子中,它应该是零尺寸。
我打算在脚本中尝试明确关闭文件,然后再试一下。
其结果是一样的。
以下是新的代码。