닫지 않은 파일이 포함된 폴더는 삭제되지 않습니다.

 
" Service Desk를 통해 개발자와 통신하십시오! "와 관련이 없는 댓글은 이 항목으로 이동되었습니다.
 

이 스크립트에서 FolderClean() 함수가 작동하지 않는 이유는 무엇입니까?

 //+------------------------------------------------------------------+ 
//|                                            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 
//--- входные параметры 
input string    firstFolder= "empty" ;     // пустая папка 
input string    secondFolder= "nonempty" ; // папка, в которой будет один файл 
string filename= "delete_me.txt" ;       // имя файла, который мы создадим в папке secondFolder 
//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart () 
  { 
//--- хендл файла запишем сюда 
   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 (); 
     } 
   else 
       PrintFormat ( "Не удалось создать папку %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 ) 
       PrintFormat ( "Открыли файл на чтение %s" ,working_folder+ "\\" +filepath); 
   else 
       PrintFormat ( "Не удалось создать файл %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); 
       else 
         PrintFormat ( "Не удалось удалить папку %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 ()); 
     }  

   else 
       Print ( "Удаление отменено" ); 
//--- 
  }

폴더를 정리하려고 하면 오류 5026이 표시됩니다. (폴더를 지울 수 없음).

이 스크립트는 문서( FolderDelete() 함수 섹션)에서 가져오고 약간 수정했습니다. 다른 하위 폴더나 파일이 포함된 폴더를 완전히 삭제하려면 폴더를 비워야 합니다. 이를 위해 FolderClean() 함수에 대한 호출이 추가되었습니다.

 
Реter Konow :

이 스크립트에서 FolderClean() 함수가 작동하지 않는 이유는 무엇입니까?

폴더를 정리하려고 하면 오류 5026이 표시됩니다. (폴더를 지울 수 없음).

이 스크립트는 문서( FolderDelete() 함수 섹션)에서 가져오고 약간 수정했습니다. 다른 하위 폴더나 파일이 포함된 폴더를 완전히 삭제하려면 폴더를 비워야 합니다. 이를 위해 FolderClean() 함수에 대한 호출이 추가되었습니다.


다른 사람의 샌드박스(MQL4에서)에 들어가려고 하는 것이 귀찮지 않습니까?

 
Vladimir Karputov :

다른 사람의 샌드박스(MQL4에서)에 들어가려고 하는 것이 귀찮지 않습니까?

나는 당신을 잘 이해하지 못했습니다. 무슨 뜻이에요. 실험은 MT4에서 수행되었습니다.
 
Реter Konow :
나는 당신을 잘 이해하지 못했습니다. 무슨 뜻이에요. 실험은 MT4에서 수행되었습니다.

파일 열기 :

메모

보안상의 이유로 파일 작업은 MQL5 언어로 엄격하게 제어됩니다. MQL5 언어를 통해 파일 작업이 수행되는 파일은 "샌드박스" 파일 외부에 있을 수 없습니다.

파일은 MQL5\Files 하위 폴더(또는 테스트의 경우 testing_agent_directory\MQL5\Files)의 클라이언트 터미널 폴더에서 열립니다. 플래그 중 FILE_COMMON을 지정하면 모든 클라이언트 터미널 \ Terminal\Common\Files의 공통 폴더에서 파일이 열립니다.

그리고 MQL5 코드를 실행하는 경우 이전 터미널은 어떻습니까?
 
Vladimir Karputov :

파일 열기 :

메모

보안상의 이유로 파일 작업은 MQL5 언어로 엄격하게 제어됩니다. MQL5 언어를 통해 파일 작업이 수행되는 파일은 "샌드박스" 파일 외부에 있을 수 없습니다.

파일은 MQL5\Files 하위 폴더(또는 테스트의 경우 testing_agent_directory\MQL5\Files)의 클라이언트 터미널 폴더에서 열립니다. 플래그 중 FILE_COMMON을 지정하면 모든 클라이언트 터미널 \ Terminal\Common\Files의 공통 폴더에서 파일이 열립니다.

이 스크립트는 문서에서 가져왔습니다.

폴더가 생성되는 경로는 다음과 같습니다.

 string working_folder= TerminalInfoString ( TERMINAL_DATA_PATH )+ "\\MQL4\\Files" ; 

부분적으로 FolderDelete() 함수가 작동하여 비어 있는 폴더를 삭제합니다. 그러나 폴더 안에 파일이 있고 먼저 삭제해야 하기 때문에 FolderDelete() 함수는 더 이상 파일이 있는 폴더에서 작동하지 않습니다. 그것을 지우기 위해 지침에 따라야 하므로 FolderClean() 함수에 대한 호출을 추가했습니다. 그런데 어떤 이유로 FolderClean() 함수가 작동하지 않고 파일이 있는 폴더가 정리되지 않습니다. 따라서 FolderDelete() 함수에 의해 삭제되지 않습니다.

 
Vladimir Karputov :

파일 열기 :

메모

보안상의 이유로 파일 작업은 MQL5 언어로 엄격하게 제어됩니다. MQL5 언어를 통해 파일 작업이 수행되는 파일은 "샌드박스" 파일 외부에 있을 수 없습니다.

파일은 MQL5\Files 하위 폴더(또는 테스트의 경우 testing_agent_directory\MQL5\Files)의 클라이언트 터미널 폴더에서 열립니다. 플래그 중 FILE_COMMON을 지정하면 모든 클라이언트 터미널 \ Terminal\Common\Files의 공통 폴더에서 파일이 열립니다.

그리고 MQL5 코드를 실행하는 경우 이전 터미널은 어떻습니까?
코드가 MQL4인지 MQL5인지에는 차이가 없습니다. 이 스크립트의 코드는 두 플랫폼에서 동일하게 작동합니다. MT4에서 테스트했습니다.
 
Реter Konow :
코드가 MQL4인지 MQL5인지에는 차이가 없습니다. 이 스크립트의 코드는 두 플랫폼에서 동일하게 작동합니다. MT4에서 테스트했습니다.

기존 터미널에서 MQL5 코드를 실행하셨나요? 지금 확인하겠습니다...

 
Vladimir Karputov :

기존 터미널에서 MQL5 코드를 실행하셨나요? 지금 확인하겠습니다...

저를 믿으십시오, 이것에는 아무 문제가 없습니다.
 
Реter Konow :
저를 믿으십시오, 이것에는 아무 문제가 없습니다.

입증해야 할 사항: 이전 터미널에는 MQL5 프로그램이 표시되지 않습니다. MQL5 스크립트 에서 다른 사람의 파일 샌드박스를 열려고 합니다.

 

Реter Konow :

그런데 어떤 이유로 FolderClean() 함수가 작동하지 않고 파일이 있는 폴더가 정리되지 않습니다. 따라서 FolderDelete() 함수에 의해 삭제되지 않습니다.

어떤 이유로 운영 체제는 파일 삭제를 허용하지 않습니다. 다른 프로그램에서 파일을 열었거나 권한이 충분하지 않습니다.

추신 그리고 일반적으로 - 프로그램 로그를 제공하지 않음 - 이것은 다른 사람들이 커피 찌꺼기를 추측하도록 하기 위한 것입니다.