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

 

Завтра попробую сделать скрипт полностью воспроизводящий эту проблему.

Чтобы люди не говорили, что я здесь "художественной литературой" занимаюсь.)

Всем БОЛЬШОЕ спасибо за желание помочь и содействие в решении. ))

 

Была вот такая плавающая ошибка (последовательность описана и библиотечный .ex5 файл был приложен). Такое задокументировать довольно затруднительно

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

A100, 2016.08.04 00:05

Ошибка открытия экспертом файла. А если например

1. убрать "некий код не имеющий отношения к делу" (см.ниже)

2. или убрать ::Sleep(1000)

то ошибки не возникает

//Test.mq5
#import "Test001.ex5"
        string f( string file );
#import
string __Period() { return StringSubstr( EnumToString((ENUM_TIMEFRAMES)Period()), 7 ); }
void OnInit()
{
        Print( Symbol(), ",", __Period(), ", результат=", f( "test.txt" ));
}

Последовательность действий:

1. Создать новый профиль (например "Тест")

2. Открыть два новых графика, прикрепив к обоим графикам эксперт Test.ex5  (см.рисунок)

4. Выбрать любой другой существующий профиль

5. Выбрать профиль "Тест"

результат:

при том, что Test001.mq5 выглядит так:

//Test001.mq5
#property library
//---
//здесь некий код не имеющий отношения к делу
//---
string f( string file ) export
{
        ::ResetLastError();
        int hFile = ::FileOpen( file, FILE_READ | FILE_SHARE_READ | FILE_TXT | FILE_ANSI | FILE_COMMON );
        if ( hFile == INVALID_HANDLE )
                return ::StringFormat( "Error(%d): Не был открыт файл: %s", ::GetLastError(), file );
        ::Sleep( 1000 );
        ::FileClose( hFile );
        return "OK";
}

Попробовал сейчас с приложенным там библиотечным файлом: результат тот же (тестовый файл по отдельности открывается обоими экспертами, а если одновременно - то один из экспертов сообщает об ошибке)
2017.08.28 23:40:43.623 Test (EURUSD,M15) EURUSD,M15, результат=OK
2017.08.28 23:40:52.389 Test (GBPUSD,M15) GBPUSD,M15, результат=OK

2017.08.28 23:41:14.387 Test (GBPUSD,M15) GBPUSD,M15, результат=Error(5004): Не был открыт файл: test.txt
2017.08.28 23:41:15.484 Test (EURUSD,M15) EURUSD,M15, результат=OK


 

Заявку нашел под номером #1530548, но без комментариев - возможно уже исправили. Если нет - то просмотрите пожалуйста еще раз

 

Реter Konow:

Файл открывается моим приложением (файловым навигатором) для перезаписи в другую папку.

Во время открытия файла для чтения получаем хендл файла.

Реter Konow:

После перезаписи мне нужно закрыть файл , но я не могу - (нет хэндла) и просто стираю файл.

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

Реter Konow:

Хендла нет, потому что файл был создан неизвестно когда и неизвестно кем.

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

Реter Konow:

При этом, файл существует внутри папки Files и может быть скопирован в другую папку и после стерт.

При копировании файла из одной доступной программе на mql хендл файла абсолютно не нужен.

Реter Konow:

Но после копирования нельзя закрыть этот файл. Нет хэндла.

После копирования файла этот файл не открыт и закрывать его нет никакой необходимости.

Реter Konow:

Вероятно, поэтому дальнейшее стирание папок FolderClean() со стертыми файлами, не срабатывает.

Абсолютное заблуждение.

Реter Konow:

Вопрос: как получить хэндл этого файла в MQL-программу?

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


Совершенно случайным образом я обнаружил в чём состоит Ваша проблема:

Во время эксперимента в проводнике или другом файловом менеджере открыта папка для наблюдения за созданием и удалением файла. И после удаления файла папка остаётся занятой и не может быть удалена. В результате чего получаем

2017.08.29 09:42:15.657 Demo_FolderDelete (CADJPY,H4)   Не удалось удалить папку nonempty. Код ошибки=5024

А вот тот факт, что после неудачной попытки удаления папки эта папка остаётся занятой, увы факт. Об этом сейчас будет создана заявка в СД.

ps; Увы, я тоже наколбасил во время эксперимента. После записи в файл, сбросил данные на диск, попытался его открыть блокнотом, но получил в ответ ...(фигу) отменить попытку открытия забыл и именно это держало папку и не давало её удалить.

Резюме: Никаких проблем в работе с файлами mql не имеет.

 

Alexey Viktorov:

Совершенно случайным образом я обнаружил в чём состоит Ваша проблема:

Во время эксперимента в проводнике или другом файловом менеджере открыта папка для наблюдения за созданием и удалением файла. И после удаления файла папка остаётся занятой и не может быть удалена. В результате чего получаем

2017.08.29 09:42:15.657 Demo_FolderDelete (CADJPY,H4)   Не удалось удалить папку nonempty. Код ошибки=5024

А вот тот факт, что после неудачной попытки удаления папки эта папка остаётся занятой, увы факт. Об этом сейчас будет создана заявка в СД.

Я натыкался на это поведение при совершенно других обстоятельствах - также держал открытой папку на удаление, в результате программы/скрипты/SVN и т.д. не могли удалить эту папку.

И лечится это всегда одинаково - ручным сносом данной папки. Так что вряд ли это проблема терминала или редактора.

 
Rashid Umarov:

Я натыкался на это поведение при совершенно других обстоятельствах - также держал открытой папку на удаление, в результате программы/скрипты/SVN и т.д. не могли удалить эту папку.

И лечится это всегда одинаково - ручным сносом данной папки. Так что вряд ли это проблема терминала или редактора.

Я чуть позже дополнил свой пост.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Alexey Viktorov, 2017.08.29 08:55


ps; Увы, я тоже наколбасил во время эксперимента. После записи в файл, сбросил данные на диск, попытался его открыть блокнотом, но получил в ответ ...(фигу) отменить попытку открытия забыл и именно это держало папку и не давало её удалить.

Резюме: Никаких проблем в работе с файлами mql не имеет.


Странно что Вы процитировали моё сообщение без этой добавки.

 
Alexey Viktorov:

Я чуть позже дополнил свой пост.


Странно что Вы процитировали моё сообщение без этой добавки.

Просто чтобы вы были готовы к ответу СД.

 
Rashid Umarov:

Просто чтобы вы были готовы к ответу СД.

Так если я понял причину проблемы зачем-же писать всякую чушь с СД? Просто я не сказал вслух, что отказался от написания... посчитал что всем и так понятно.
 
Rashid Umarov:

Я натыкался на это поведение при совершенно других обстоятельствах - также держал открытой папку на удаление, в результате программы/скрипты/SVN и т.д. не могли удалить эту папку.

И лечится это всегда одинаково - ручным сносом данной папки. Так что вряд ли это проблема терминала или редактора.

А вот факт открытия папки в файловом менеджере, НЕ ФАЙЛА, не влияет на её удаление средствами mql.

 
Alexey Viktorov:

1. Во время открытия файла для чтения получаем хендл файла.

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

3. Если файл был создан неизвестно когда и неизвестно кем, то ОЧЕНЬ велика вероятность, что этот файл никаким приложением не занят. Если-же Вы открываете этот файл с какой-то целью, то у вас уже есть хендл полученный функцией FileOpen и соответственно должны его закрыть перед очисткой папки.

4. При копировании файла из одной доступной программе на mql хендл файла абсолютно не нужен.

5. После копирования файла этот файл не открыт и закрывать его нет никакой необходимости.


1. Хендл нужен только для функции FileClose. Я файл не открываю. Он был создан до меня. Я его только копирую и стираю. Закрыть не могу, потому что нет хендла.

2. Для копирования (FileCopy), для перемещения (FileMove) хендл файла не нужен. Посмотрите в документации.

3. Если я открываю созданный кем то ранее файл функцией FileOpen, то я не получу его хендл. Неизвестно вообще, какой хендл я получу. Может быть его, а может совсем другой. Я пробывал так получать хендл чужого файла, чтобы после операции копирования его закрыть FileClose. Ничего не дало.

4. При копировании хэндл не нужен. Копируется без проблем. Но для копирования файл автоматически открывается. Далее, закрыть его с FileClose с не могу, потому что нет хендла. Вероятно поэтому не срабатывает FolderClean после стирания скопированных файлов.

5. Откуда Вы знаете, что после копирования файл не открыт? Он не был явно открыт функцией FileOpen, но с ним производилось копирование, а значит он открыт. Следовательно, он остается открыт после копирования и даже после стирания. Вероятно.