Не удаляется папка, если в ней есть незакрытые файлы - страница 5

 
Rashid Umarov:

Я помню ваше "у меня все ходы записаны" в ветке ООП vs процедурное программирование .  В этой ветке я лишь убедился, что верить вам нельзя.

Нет доказательств и деталей - не нужно писать в сервисдеск. 


Моя проблема с удалением папок до сих пор не решилась. Скрипт работает, но причину своей проблемы я пока не нашел. 


Возможны разные варианты. Это может быть моя или не моя ошибка. В целях решения вопроса всегда готов предоставлять нужную информацию.


Мое обращение в сервисдек, - это ни в коем случае не претензия. 

 
Rashid Umarov:

Я помню ваше "у меня все ходы записаны" в ветке ООП vs процедурное программирование .  В этой ветке я лишь убедился, что верить нельзя

Не понимаю, о каких ходах Вы говорите, и почему считаете, что мне верить нельзя. Возможно, я дал повод для этого, но не помню где именно и когда.

В любом случае, спасибо за откровенное высказывание своего отношения ко мне. Это лучше знать, чем не знать.

 

Надеюсь, вы действительно поняли.  Вы отлично выполнили Вредные советы — как не надо писать в Сервисдеск

 
Rashid Umarov:

Надеюсь, вы действительно поняли.  Вы отлично выполнили Вредные советы — как не надо писать в Сервисдеск


Увы, не понял. В своем обращении я постарался быть максимально четким и конкретным. Сообщил детали, привел гиф-файл, код скрипта с комментариями. Так что именно я сделал неправильно?

 

Вы действительно не можете прочитать справку и правильно изменить код? Как вы тогда можете требовать другого отношения? Вот код из справки, добавки выделены желтым

//+------------------------------------------------------------------+
//|                                                Test_FileOpen.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- неправильный способ открытия файла
   string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);
   string filename=terminal_data_path+"\\MQL5\\Files\\"+"fractals.csv";
   int filehandle=FileOpen(filename,FILE_WRITE|FILE_CSV);
   if(filehandle<0)
     {
      Print("Неудачная попытка открыть файл по абсолютному пути");
      Print("Код ошибки ",GetLastError());
     }
//--- правильный способ работы в "файловой песочнице"
   ResetLastError();
   filehandle=FileOpen("fractals.csv",FILE_WRITE|FILE_CSV);
   if(filehandle!=INVALID_HANDLE)
     {
      FileWrite(filehandle,TimeCurrent(),Symbol(),EnumToString(_Period));
      FileClose(filehandle);
      Print("FileOpen OK");
     }
   else Print("Операция FileOpen неудачна, ошибка ",GetLastError());

//--- еще один пример с созданием вложенной директории в MQL5\Files\
   string subfolder="Research";
   filehandle=FileOpen(subfolder+"\\fractals.txt",FILE_WRITE|FILE_CSV);
   if(filehandle!=INVALID_HANDLE)
     {
      FileWrite(filehandle,TimeCurrent(),Symbol(),EnumToString(_Period));
      FileClose(filehandle);
      Print("Файл должен быть создан в папке "+terminal_data_path+"\\"+subfolder);
     }
   else Print("Операция FileOpen неудачна, ошибка ",GetLastError());
//---
   Print("Очищаем папку \\MQL5\\",subfolder);
   FolderClean(subfolder,1);

   Print("Удаляем папку \\MQL5\\",subfolder);
   if(!FolderDelete(subfolder,1))
      PrintFormat("Ошибка! Не удалось удалить папку  \\MQL5\\",subfolder);
  }
//+------------------------------------------------------------------+
 
Rashid Umarov:

Вы действительно не можете прочитать справку и правильно изменить код? Как вы тогда можете требовать другого отношения? Вот код из справки, добавки выделены желтым

Если отношение к моей персоне зависит от того, не совершил ли я ошибку в коде, то боюсь, что то здесь не то...)))

Я до сих пор, не очень понимаю Ваших претензий.

Измененный мною код я выставлял не раз на форуме. Единственная моя ошибка была в том, что после добавление явного закрытия файла, я забыл пересохранить скрипт и потому не увидел, что это решило проблему в измененном мною скрипте. Однако, в любом случае, в документации явно не сказано, что после создания файлы нужно обязательно закрывать.

По мимо этого, как я уже говорил, моя проблема со стиранием папок (заметьте не файлов) все равно осталась. В папках файлов уже нет, но возникает ошибка их стирания функцией FolderClean.

Причина пока не ясна.

Так что возможно, в сервисдеск я обратился все таки не зря.

Спасибо за столь долгое внимание к моей проблеме.))

 
Реter Konow:
Спасибо. Рад что я не один с этой проблемой столкнулся. Мне "кровь из носу" нужно решить эту проблему (без этого не могу завершить польз.файловый навигатор). Написал в сервисдек. Но на всякий случай и сюда пишу. Оказалось не зря.) 
               
fxsaber:

Наблюдал неоднократно такие вещи. Выяснил, что в какой-то момент папка Files со всеми подпапками и файлами получает атрибут read-only. Снятие руками этого флага не помогает. Но всегда помогает перезапуск терминала. Добиться воспроизведения не смог (не пытался), поэтому в СД не сообщал.

Присоединяюсь. У меня с начала 2014 года стали возникать ранее крайне редко появлявшиеся сбои, которые порождали ошибку ОС "32 Sharing violation" в 9 попытках создать файл в этой папке, идущих подряд с шагом 16 миллисекунд. Понять, в чем дело, я не смог. Грешил на "радикальное обновление функций работы с файлами", происходившее в то время в MQ. Воспроизвести тоже не могу, вот по случайности только что, в 20:12:42, произошел такой сбой. Тут же, прошло несколько секунд, полез в файл в этой папке, удалось корректно его отредактировать и сохранить. Сбой не ловится.

Перед этим 5 лет этот сбой появлялся один-два раза в месяц, с февраля 2014 обязательно каждую неделю, сколько раз - не считал. Хотя число одновременно запущенных терминалов уменьшилось с 40-50 до 35.

 
Vladimir:
               

Присоединяюсь. У меня с начала 2014 года стали возникать ранее крайне редко появлявшиеся сбои, которые порождали ошибку ОС "32 Sharing violation" в 9 попытках создать файл в этой папке, идущих подряд с шагом 16 миллисекунд. Понять, в чем дело, я не смог. Грешил на "радикальное обновление функций работы с файлами", происходившее в то время в MQ. Воспроизвести тоже не могу, вот по случайности только что, в 20:12:42, произошел такой сбой. Тут же, прошло несколько секунд, полез в файл в этой папке, удалось корректно его отредактировать и сохранить. Сбой не ловится.

Перед этим 5 лет этот сбой появлялся один-два раза в месяц, с февраля 2014 обязательно каждую неделю, сколько раз - не считал. Хотя число одновременно запущенных терминалов уменьшилось с 40-50 до 35.

У меня все файлы стираются даже без явного закрытия. Стираются, потому что я их не создавал и они были до этого внутри папки Files.

Дело в том, что чтобы стереть файл, нужен его хендл. Однако, если мы не создавали этот файл, а только поместили его в папку Files, то мы не можем получить его Хэндл, а следовательно и закрыть функцией FileClose() не можем.

При этом, мы все равно можем его скопировать или стереть. Однако, папку после этого удалить не удается ни программно, ни вручную. Вручную только после перезапуска терминала.

Позже попробую воспроизвести проблему более четко, с наглядными примерами.

 
Реter Konow:

У меня все файлы стираются даже без явного закрытия. Стираются, потому что я их не создавал и они были до этого внутри папки Files.

Дело в том, что чтобы стереть файл, нужен его хендл. Однако, если мы не создавали этот файл, а только поместили его в папку Files, то мы не можем получить его Хэндл, а следовательно и закрыть функцией FileClose() не можем.

При этом, мы все равно можем его скопировать или стереть. Однако, папку после этого удалить не удается ни программно, ни вручную. Вручную только после перезапуска терминала.

Позже попробую воспроизвести проблему более четко, с наглядными примерами.

Наверное, в этом и есть суть проблемы.

При переименовывании папки в пользовательском файловом навигаторе, я не могу воспользоваться функцией FolderRename(), потому что ее не существует.

Вместо этого, я копирую все файлы и папки в новую папку, с пользовательским названием и удаляю исходные оригиналы файлов и папок из исходной папки (которую переименовываю). В результате, я сначала стираю все файлы из исходной папки (после их копирования в новую папку), а потом функцией FolderClean() пытаюсь удалить оставшуюся иерархию папок в исходной папке, которые уже пусты. На этом месте и происходит ошибка. Некоторые папки стираются, но одна - две остаются, также как и исходная папка. После я пытаюсь стереть ее вручную и это не удается. Помогает только перезапуск терминала.

 
Реter Konow:

Наверное, в этом и есть суть проблемы.

При переименовывании папки в пользовательском файловом навигаторе, я не могу воспользоваться функцией FolderRename(), потому что ее не существует.

Вместо этого, я копирую все файлы и папки в новую папку, с пользовательским названием и удаляю исходные оригиналы файлов и папок из исходной папки (которую переименовываю). В результате, я сначала стираю все файлы из исходной папки (после их копирования в новую папку), а потому функцией FolderClean() пытаюсь удалить оставшуюся иерархию папок в исходной папке, которые уже пусты. На этом месте и происходит ошибка. Некоторые папки стираются, но одна - две остаются, также как и исходная папка. После я пытаюсь стереть ее вручную и это не удается. Помогает только перезапуск терминала.


Пожалуйста продолжайте - пока Вы пишите в увлекательном жанре "художественная литература". Надеюсь, что эдак к странице 40-й перейдёте на жанр "техническая литература".