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

 
Реter Konow :

내 말은, 스크립트에서 고문을 만들고 실행하려고 했습니까?

왜 리모델링을 할까요? 확인하기에는 너무 게으르지만 FILE_SHARE_READ FILE_SHARE_WRITE 플래그 를 시도하면
 
A100 그리고 모든 곳에 FILE_COMMON 을 넣으십시오.

STARIJ 왜 다시 실행합니까? 확인하기에는 너무 게으르지만 FILE_SHARE_READ FILE_SHARE_WRITE 플래그 를 시도하면

사실은 이러한 플래그가 FolderClean() 함수와 어떤 관련이 있는지 알 수 없다는 것입니다. 제 생각에는 전혀 없습니다.

파일이 전혀 아님을 증명하고 싶습니다. "notempty" 폴더에 중첩된 "DeleteMe.txt" 파일 대신 "DeleteMe Folder" 폴더를 생성하고 이전에 파일로 시도했던 것처럼 이 폴더를 삭제하도록 스크립트를 다시 만들 것입니다. 차이가 있는지 살펴보자.)

Automated Trading and Strategy Testing
Automated Trading and Strategy Testing
  • www.mql5.com
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
 
Реter Konow :

사실은 이러한 플래그가 FolderClean() 함수와 어떤 관련이 있는지 알 수 없다는 것입니다. 제 생각에는 전혀 없습니다.

폴더에 파일이 없거나 삭제할 수 있는 경우 폴더를 삭제할 수 있습니다. 이 플래그는 파일 액세스를 허용합니다.

 
Реter Konow :

내 말은, 스크립트에서 고문을 만들고 실행하려고 했습니까?

고문이 한 일을 내가 어디에서 말했습니까?

 

나는 실제로 파일을 명시적으로 닫는 것이 효과가 있다고 말해야 합니다. 내가 잘못 본 것 같습니다. 처음에는 작동하지 않았습니다. 아마도 변환된 스크립트의 새 버전을 저장하지 않았고 명시적 닫기가 적용되지 않았기 때문일 것입니다.

이제 파일 대신 폴더를 만들 려고 했습니다. 그들은 문제없이 씻습니다.

그런 다음 파일 생성을 다시 추가했습니다. 결과: 명시적으로 파일을 닫지 않으면 이전과 같이 스크립트에 의해 폴더가 삭제되지 않습니다. 파일을 명시적으로 닫으면 완전히 지워집니다.

물론 이 경험이 모든 것을 설명하는 것은 아니며 일부는 모호하지만 이 결과는 고무적입니다.

테스트를 계속하고 결과를 보고하겠습니다.

아마도 여전히 문제가 있을 것이며 지금은 확실히 말하기가 어렵습니다.

 
Alexey Viktorov :

고문이 한 일을 내가 어디에서 말했습니까?

죄송합니다, 제가 잘못 이해했습니다.
 

다음은 "DeleteMe.txt" 파일과 "DeleteMe 폴더"를 모두 생성하는 스크립트 코드입니다. 파일은 생성 직후에 명시적으로 닫힙니다.

모든 것이 작동하는 것 같습니다 ...

 //+------------------------------------------------------------------+ 
//|                                            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 FolderName= "delete_me Folder" ;       // имя файла, который мы создадим в папке secondFolder 
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 ());
 
//--- теперь создадим пустую папку с помощью функции FolderCreate 
   string filepath=secondFolder+ "\\" +FolderName;   // сформируем путь для файла, который хотим открыть на запись в несуществующей папке 

   if ( FolderCreate (filepath)) 
     { 
       FolderCreate (filepath + "1" );
       PrintFormat ( "Открыли папку %s" ,working_folder+ "\\" +filepath); 
     } 
   else 
       PrintFormat ( "Не удалось создать папку %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); 
     } 
   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 ( "Удаление отменено" ); 
//--- 
  }


 
Реter Konow :

물론 이 경험이 모든 것을 설명하는 것은 아니며 일부는 모호하지만 이 결과는 고무적입니다.

테스트를 계속하고 결과를 보고하겠습니다.

아마도 여전히 문제가 있을 것이며 지금은 확실히 말하기가 어렵습니다.

네. 물론 씁니다. 그리고 세부 사항은 스스로에게 맡기고 "나는 도움말에서 예제를 약간 변경했습니다. 전혀 변경하지 않았습니다."라고 말하십시오.

그리고 우리는 계속 추측할 것입니다. 결국 누구나 로그로 추측할 수 있습니다. 그리고 훨씬 더 흥미롭습니다.

 
Rashid Umarov :

네. 물론 씁니다. 그리고 세부 사항은 스스로에게 맡기고 "나는 도움말에서 예제를 약간 변경했습니다. 전혀 변경하지 않았습니다."라고 말하십시오.

그리고 우리는 계속 추측할 것입니다. 결국 누구나 로그로 추측할 수 있습니다. 그리고 훨씬 더 흥미롭습니다.

기이한. 개인적이지 않은 일. 제가 프로답지 못하다면 죄송합니다. 나는 공부할 것이다.

도움을 주셔서 감사합니다.


PS는 포럼에서 도움을 요청한 적이 없습니다. 따라서 경험이 없습니다.

 

OOP 대 절차적 프로그래밍 스레드에서 "내 모든 움직임을 기록했습니다"를 기억합니다 . 이 스레드에서 나는 당신이 신뢰할 수 없다는 것을 확인했습니다.

증거와 세부 사항이 없습니다. 서비스 데스크에 편지를 쓸 필요가 없습니다.