Kapatılmamış dosyalar içeriyorsa klasör silinmez

 
" Geliştiricilerle Service Desk aracılığıyla iletişim kurun!" ile ilgili olmayan yorumlar bu konuya taşınmıştır.
 

FolderClean() işlevi neden bu komut dosyasında çalışmıyor: ?

 //+------------------------------------------------------------------+ 
//|                                            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 ( "Удаление отменено" ); 
//--- 
  }

Bir klasörü temizleme girişiminin bir sonucu olarak, 5026 - (klasör temizlenemiyor) hatası veriyor.

Bu komut dosyası belgelerden alınmıştır ( KlasörDelete() işlevinin bölümü) ve biraz değiştirilmiştir. Diğer alt klasörleri veya dosyaları içeren bir klasörü tamamen silmek için onu boşaltmanız gerekir. Bunun için FolderClean() işlevine bir çağrı eklendi.

 
Реter Konow :

FolderClean() işlevi neden bu komut dosyasında çalışmıyor: ?

Bir klasörü temizleme girişiminin bir sonucu olarak, 5026 - (klasör temizlenemiyor) hatası veriyor.

Bu komut dosyası belgelerden alınmıştır (KlasörDelete() işlevinin bölümü) ve biraz değiştirilmiştir. Diğer alt klasörleri veya dosyaları içeren bir klasörü tamamen silmek için onu boşaltmanız gerekir. Bunun için FolderClean() işlevine bir çağrı eklendi.


Başka birinin sanal alanına (MQL4'te) girmeye çalışmanız sizi rahatsız etmiyor mu?

 
Vladimir Karputov :

Başka birinin sanal alanına (MQL4'te) girmeye çalışmanız sizi rahatsız etmiyor mu?

ben seni pek anlamadım Ne demek istiyorsun. Deney MT4 üzerinde gerçekleştirildi.
 
Реter Konow :
ben seni pek anlamadım Ne demek istiyorsun. Deney MT4 üzerinde gerçekleştirildi.

Dosya Aç :

Not

Güvenlik nedeniyle, dosyalarla çalışmak MQL5 dilinde sıkı bir şekilde kontrol edilir. MQL5 dili aracılığıyla dosya işlemlerinin gerçekleştirildiği dosyalar "sandbox" dosyasının dışında bulunamaz.

Dosya, MQL5\Files alt klasöründeki (veya test durumunda test_agent_directory\MQL5\Files) istemci terminal klasöründe açılır. İşaretler arasında FILE_COMMON belirtilirse, dosya tüm istemci terminalleri \ Terminal\Common\Files ortak klasöründe açılır.

Peki ya MQL5 kodunu çalıştırırsanız eski terminal?
 
Vladimir Karputov :

Dosya Aç :

Not

Güvenlik nedeniyle, dosyalarla çalışmak MQL5 dilinde sıkı bir şekilde kontrol edilir. MQL5 dili aracılığıyla dosya işlemlerinin gerçekleştirildiği dosyalar "sandbox" dosyasının dışında bulunamaz.

Dosya, MQL5\Files alt klasöründeki (veya test durumunda test_agent_directory\MQL5\Files) istemci terminal klasöründe açılır. İşaretler arasında FILE_COMMON belirtilirse, dosya tüm istemci terminalleri \ Terminal\Common\Files ortak klasöründe açılır.

Bu komut dosyası belgelerden alınmıştır.

İşte klasörlerin oluşturulduğu yol:

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

Kısmen, FolderDelete() işlevi çalışır ve boş olan klasörü siler. Ancak, FolderDelete() işlevi artık dosya içeren bir klasörde çalışmaz, çünkü klasörün içinde bir dosya vardır ve önce bu dosyanın silinmesi gerekir. Silmek için, talimatlara göre olması gerektiği gibi FolderClean() işlevine bir çağrı ekledim. Ancak, FolderClean() işlevi nedense çalışmıyor ve dosyanın bulunduğu klasör temizlenmiyor. Sonuç olarak, FolderDelete() işlevi tarafından silinmez.

 
Vladimir Karputov :

Dosya Aç :

Not

Güvenlik nedeniyle, dosyalarla çalışmak MQL5 dilinde sıkı bir şekilde kontrol edilir. MQL5 dili aracılığıyla dosya işlemlerinin gerçekleştirildiği dosyalar "sandbox" dosyasının dışında bulunamaz.

Dosya, MQL5\Files alt klasöründeki (veya test durumunda test_agent_directory\MQL5\Files) istemci terminal klasöründe açılır. İşaretler arasında FILE_COMMON belirtilirse, dosya tüm istemci terminalleri \ Terminal\Common\Files ortak klasöründe açılır.

Peki ya MQL5 kodunu çalıştırırsanız eski terminal?
Kodun MQL4 veya MQL5 olması arasında fark yoktur. Bu betiğin kodu her iki platformda da aynı şekilde çalışır. MT4'te test ettim.
 
Реter Konow :
Kodun MQL4 veya MQL5 olması arasında fark yoktur. Bu betiğin kodu her iki platformda da aynı şekilde çalışır. MT4'te test ettim.

MQL5 kodunu eski terminalde çalıştırdınız mı? şimdi kontrol edeceğim...

 
Vladimir Karputov :

MQL5 kodunu eski terminalde çalıştırdınız mı? şimdi kontrol edeceğim...

İnanın bunda hiçbir sorun yok.
 
Реter Konow :
İnanın bunda hiçbir sorun yok.

Kanıtlanması gereken şey: eski terminal MQL5 programlarını GÖREMİYOR. Bir MQL5 komut dosyasında başka birinin dosya sanal alanını açmaya çalışıyorsunuz.

 

Реter Konow :

Ancak, FolderClean() işlevi nedense çalışmıyor ve dosyanın bulunduğu klasör temizlenmiyor. Sonuç olarak, FolderDelete() işlevi tarafından silinmez.

Nedense işletim sistemi dosyanın silinmesine izin vermiyor - ya başka bir program tarafından açılıyor ya da yeterli haklar yok.

PS Ve genel olarak - program günlükleri vermemek - bu, diğerlerini kahve telvesi üzerinde tahmin etmeye zorlamak içindir.
Neden: