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

 
Rashid Umarov :

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

Aynen öyle. Halihazırda alt klasörler ve dosyalar içeren bir klasörü silmeye çalıştığımda, önce dosyaları siliyorum. Yalnızca alt klasörler kalır. Bunları FolderClean() ile temizlemeye çalışıyorum ve ardından FolderDelete()'i çağırıyorum. Bununla birlikte, sonuç olarak, boş olan alt klasörler iyi bir şekilde silinir, ancak alt klasörlerin içinde daha fazla alt klasör varsa bunlar silinmez. Bundan sonra, MetaEditor'daki dosya gezgininden klasörleri manuel olarak silmeye çalışıyorum, ancak terminal onları silmiyor ve şu pencereyi açıyor:

"Devam"a tıklıyorum, değişiklikleri kabul ediyorum, ancak klasör hala silinmedi. Terminali tamamen kapatıp yeniden açtıktan sonra, silinmesi gereken klasörler ya kendiliğinden kaybolur ya da kaybolmaz, ancak yukarıdaki pencere olmadan manuel olarak zaten silinebilirler.

İşte bazı tuhaflıklar...

 
Vladimir Karputov :

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.

Fonksiyonlar her iki terminalde de aynı şekilde çalışır. Komut dosyasının üzerinde çalıştığı terminalin dosya sanal alanı kullanılır. Bunlar, kullanılan terminalin yerel dosyalarıdır. İnanın bu kesinlikle bir sorun değil...
 
Rashid Umarov :


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

Şu gife bakın:



Bu scriptin kodunu yukarıda, son sayfada verdim.

 

Önce programlı sonra manuel olarak silmeye çalıştığım klasörlerin hiçbir yerde açık olmadığını da ekleyeceğim. Ayrıca, boş olduklarından ve içindeki dosyalar daha önce silindiğinden, MetaEditor'da dosya gezgininin kendisinden başka hiçbir yerde açılamazlar. Silinen dosyalar da hiçbir yerde açık değildi.

Meta düzenleyicideki dosya gezgininde klasörleri manuel olarak silmek için yönetici onayı gerektiren pencere, yalnızca programın daha önce FolderClean() ve FolderDelete() işlevlerini kullanarak silmeye çalıştığı klasörleri silmeye çalışırken görünür. Diğer klasörleri silmeye çalışırken bu pencere asla görünmez.

 
Ре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.

Ve bir dosyanın neden kapatılmadığını merak etmek mümkün mü? Yoksa ben mi görmüyorum?

İşte bir dosyayı açmaktan silme hakkında soru sormaya kadar kodunuzun bir parçası...

   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() нельзя использовать в индикаторах!
 
//--- выведем диалоговое окно и просим пользователя 
 
Alexey Viktorov :

Ve bir dosyanın neden kapatılmadığını merak etmek mümkün mü? Yoksa ben mi görmüyorum?

İşte bir dosyayı açmaktan silme hakkında soru sormaya kadar kodunuzun bir parçası...

Bildiğim kadarıyla, dosya işlevleri (örneğin, FileWrite()) kullanılarak dosyada herhangi bir değişiklik yapılmadıysa, kapatmaya gerek yoktur. FileOpen() işlevi yalnızca yeni bir dosya oluşturur ve bu işlem dosyanın kapatılmasını gerektirmez (bu işlevin belgeleri ayrıca dosyanın oluşturulduktan sonra kapatılması gerektiğini söylemez). Ayrıca bu komut dosyası belgelerden alınmıştır ve orada hiçbir şeye hükmetmedim. Sadece FolderClean() işleviyle satırları ekledim.
 
Реter Konow :
Bildiğim kadarıyla, FileWrite() işlevi kullanılarak dosyada herhangi bir değişiklik yapılmadıysa, kapatmaya gerek yok. FileOpen() işlevi yalnızca yeni bir dosya oluşturur ve bu işlem dosyanın kapatılmasını gerektirmez. Ayrıca bu komut dosyası belgelerden alınmıştır ve orada hiçbir şeye hükmetmedim. Sadece FolderClean() işleviyle satırları ekledim.

Ancak, hata ayıklayıcıyla kodu gözden geçirirseniz, FileOpen() yürütüldükten hemen sonra, diskte sıfır boyutlu bir dosya vardır. Ve belgelerde birçok hata ve yanlışlıklar var.

 
Alexey Viktorov :

Ancak, hata ayıklayıcıyla kodu gözden geçirirseniz, FileOpen() yürütüldükten hemen sonra, diskte sıfır boyutlu bir dosya vardır. Ve belgelerde birçok hata ve yanlışlıklar var.

Bu nedenle, bu örnek için sıfır beden olmalıdır.

Şimdi komut dosyasına dosyanın açık bir kapanışını eklemeye çalışacağım ve tekrar deneyeceğim.

 
Реter Konow :

Bu nedenle, bu örnek için sıfır beden olmalıdır.

Şimdi komut dosyasına dosyanın açık bir kapanışını eklemeye çalışacağım ve tekrar deneyeceğim.

Nadiren kod örneklerine bakarım ve klasörü silmek sorunsuz bir şekilde yapıldı. Yani sorunun bu olduğundan %99 eminim.
 

Sonuç aynı.

İşte yeni kod:

 //+------------------------------------------------------------------+ 
//|                                            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 ) 
     {
//*************************************************************************     
   //---- Явно закрываем файл.   
       FileClose (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 ( "Удаление отменено" ); 
//--- 
  }