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

 
Bir şey ilgimi çekti - ne hakkında? Özgür olacağım - araştıracağım ... Tabii ki, sorunun daha özlü bir ifadesini istiyorum
 
Vladimir Karputov :

Lütfen devam edin - heyecan verici "kurgu" türünde yazdığınız sürece. Umarım 40. sayfada "teknik edebiyat" türüne geçersiniz.

Hata örtük. Artık daha fazla teknik detay vermek zor.
 
Реter Konow :

Bana göre tüm dosyalar, açık bir şekilde kapatılmadan bile silinir. Silindiler çünkü onları ben yaratmadım ve ondan önce Dosyalar klasöründeydiler.

Gerçek şu ki, bir dosyayı silmek için onun tanıtıcısına ihtiyacınız var. Ancak, bu dosyayı biz yaratmadıysak, sadece Files klasörüne yerleştirdiysek, Handle'ını alamıyoruz ve bu nedenle onu FileClose() işleviyle kapatamayız.

Aynı zamanda, yine de kopyalayabilir veya silebiliriz. Ancak bundan sonraki klasör, programlı veya manuel olarak silinemez. Yalnızca terminali yeniden başlattıktan sonra manuel olarak.

Daha sonra açıklayıcı örneklerle sorunu daha açık bir şekilde yeniden oluşturmaya çalışacağım.

Sadece kodun tamamlanması gerekiyor. Dosya açıksa, bilgisayarı kapatmadan veya MT4\5'i kapatmadan önce kapatılmalıdır. Ve tutamaç arzu edilir, programın herhangi bir yerinden mevcut olmalıdır. Bu IMHO'dur. Daha da iyisi, üzerinde bir okuma/yazma işlemi gerçekleştirildikten sonra veya hiçbir şey yapılması gerekmese bile dosyayı hemen kapatın.

Dokümantasyon örneğinde, görünüşe göre nasıl yapılmayacağını gösterdiler.

Ayrıca bir dosyaya yazarken, yazılanları sadece fonksiyon ile I/O dosya arabelleğinde kalan tüm verileri diske atarak okuyabileceğinizi de unutmamak çok önemlidir. FileFlush veya dosyayı kapatarak. Kapatma sırasında veriler diske atılmaya zorlanır.

Özet: Bir dosyayı açarsanız, kapatmayı unutmayın. Ve dosya tanıtıcısı kaybolmaz.

Документация по MQL5: Файловые операции / FileFlush
Документация по MQL5: Файловые операции / FileFlush
  • www.mql5.com
Файловые операции / FileFlush - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov :

Sadece kodun tamamlanması gerekiyor. Dosya açıksa, bilgisayarı kapatmadan veya MT4\5'i kapatmadan önce kapatılmalıdır. Ve tutamaç arzu edilir, programın herhangi bir yerinden mevcut olmalıdır. Bu IMHO'dur. Daha da iyisi, üzerinde bir okuma/yazma işlemi gerçekleştirildikten sonra veya hiçbir şey yapılması gerekmese bile dosyayı hemen kapatın.

Dokümantasyon örneğinde, görünüşe göre nasıl yapılmayacağını gösterdiler.

Ayrıca bir dosyaya yazarken, yazılanları sadece fonksiyon ile I/O dosya arabelleğinde kalan tüm verileri diske atarak okuyabileceğinizi de unutmamak çok önemlidir. FileFlush veya dosyayı kapatarak. Kapatma sırasında veriler diske atılmaya zorlanır.

Özet: Bir dosyayı açarsanız, kapatmayı unutmayın. Ve dosya tanıtıcısı kaybolmaz.

Bir kez daha: Programım tarafından oluşturulan dosyayı FileClose() işleviyle kapatabilirim - tutamacı bende.

Daha önce biri tarafından oluşturulmuş, ancak Dosyalar klasöründe bulunan bir dosya, tutamacı bende olmadığı için FileClose () işleviyle kapatılamaz.

Kendim tarafından oluşturulmamış (programım tarafından değil) bir dosyayı kopyalarsam, FileClose() işleviyle (tutamaçsız) kopyaladıktan sonra kapatamam, AMA SİLEBİLİRİM.

Belki de bu nedenle, kopyalanan ve ardından silinen dosyalara sahip klasörler, FolderClean() işlevi tarafından silinmez. Belki de kopyaladıktan sonra kapanmadıkları için.

AMA KAPATMAK MÜMKÜN DEĞİL, ÇÜNKÜ KOLU YOKTUR!

:)))

 

Geliştiriciler için sorular:

1. Komut dosyası yüklenmeden önce Dosyalar klasöründe oluşturulan dosya tanıtıcısı nasıl alınır?

2. Klasörleri, daha önce başka bir klasöre kopyalanan ve kopyalandıktan sonra kapatılmayan (tutamaç olmadığı için) dosyaları sildikten sonra , FolderClean() işlevi kullanılarak silinme sorununun yukarıda açıklanan nedeni olabilir mi?

 
Реter Konow :

Geliştiriciler için sorular:

1. Komut dosyası yüklenmeden önce Dosyalar klasöründe oluşturulan dosya tanıtıcısı nasıl alınır?

2. Klasörleri, daha önce başka bir klasöre kopyalanan ve kopyalandıktan sonra kapatılmayan (tutamaç olmadığı için) dosyaları sildikten sonra , FolderClean() işlevi kullanılarak silinme sorununun yukarıda açıklanan nedeni olabilir mi?


Bu, olduğu gibi, işletim sisteminin temelleridir. Bir uygulama yazmak için bir dosya açtıysa, ne bu dosya ne de onu içeren klasör silinemez. Dosyayı Word'de açmayı ve ardından bulunduğu klasörü silmek için işletim sistemini kullanmayı deneyin. Ne olacak? Erişim olmadığı için çalışmaz.

Dosya tanıtıcısını alabilirsin. Ama bu eylemin kullanımı nedir? Sonuçta, dosya başka bir uygulama tarafından açılırsa, önceki ifadeye bakın. Ve sadece uygulamamızda geçerli olan tanıtıcıyı alacağız.

 
Ihor Herasko :

Bu, olduğu gibi, işletim sisteminin temelleridir. Bir uygulama yazmak için bir dosya açtıysa, ne bu dosya ne de onu içeren klasör silinemez. Dosyayı Word'de açmayı ve ardından bulunduğu klasörü silmek için işletim sistemini kullanmayı deneyin. Ne olacak? Erişim olmadığı için çalışmaz.

Dosya tanıtıcısını alabilirsin. Ama bu eylemin kullanımı nedir? Sonuçta, dosya başka bir uygulama tarafından açılırsa, önceki ifadeye bakın. Ve sadece uygulamamızda geçerli olan tanıtıcıyı alacağız.

Dosya, başka bir klasörün üzerine yazılmak üzere uygulamam (dosya gezgini) tarafından açılır.

Üzerine yazdıktan sonra dosyayı kapatmam gerekiyor ama yapamıyorum (işlem yok) ve dosyayı silemiyorum.

Hiçbir tanıtıcı yok, çünkü dosya ne zaman ve kim tarafından oluşturulduğunu kimse bilmiyor.

Bu durumda dosya, Dosyalar klasörünün içinde bulunur ve başka bir klasöre kopyalanabilir ve ardından silinebilir.

Ancak kopyaladıktan sonra bu dosyayı kapatamazsınız. Kol yok.

Silinen dosyalara sahip FolderClean() klasörlerinin daha fazla silinmesinin çalışmamasının nedeni bu olabilir.


Soru: Bir MQL programında bu dosyanın tanıtıcısı nasıl alınır?

 

Görünen o ki topluluk henüz böyle bir sorunla karşılaşmamış... :)

Tamam, bir şey düşüneceğim.

Her zamanki gibi.))

 

Efsaneleri çürütüyoruz.

Yani, işletim sistemiyle ilgili terminal verileri:

 2017.08 . 28 22 : 20 : 53.474 Terminal        MetaTrader 5 x64 build 1653 started (MetaQuotes Software Corp.)
2017.08 . 28 22 : 20 : 53.476 Terminal        Windows 10 Pro (x64 based PC), IE 11.00 , UAC, Intel Core i3- 3120 M  @ 2.50 GHz, RAM: 4830 / 8077 Mb, HDD: 315702 / 475588 Mb, GMT+ 02 : 00
2017.08 . 28 22 : 20 : 53.476 Terminal        C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

Testler sırasında, [veri klasörü]\MQL5\Files klasöründe önceden "test" klasörü oluşturuldu ve içinde aşağıdaki içeriğe sahip bir "source.txt" metin dosyası oluşturuldu:

 FileCopy
The function copies the original file from a local or shared folder to another file.
bool    FileCopy ( 
   const string   src_file_name,     // Name of a source file 
   int            common_flag,       // Location 
   const string   dst_file_name,     // Name of the destination file 
   int            mode_flags         // Access mode 
   );


Adım 1: "source.txt" dosyasını MQL5 kullanarak başka bir dosyaya kopyalama

Senaryo:

 //--- display the window of input parameters when launching the script 
#property script_show_inputs 
//--- input parameters 
input string InpSrc= "test\\source.txt" ;       // source 
input string InpDst= "test\\destination.txt" ;   // copy 
input int     InpEncodingType= FILE_ANSI ; // ANSI=32 or UNICODE=64 
//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart ()
  {
//--- display the source contents (it must exist) 
   if (!FileDisplay(InpSrc))
       return ;
//--- check if the copy file already exists (may not be created) 
   if (!FileDisplay(InpDst))
     {
       //--- the copy file does not exist, copying without FILE_REWRITE flag (correct copying) 
       if ( FileCopy (InpSrc, 0 ,InpDst, 0 ))
         Print ( "File is copied!" );
       else
         Print ( "File is not copied!" );
     }
   else
     {
       //--- the copy file already exists, try to copy without FILE_REWRITE flag (incorrect copying) 
       if ( FileCopy (InpSrc, 0 ,InpDst, 0 ))
         Print ( "File is copied!" );
       else
         Print ( "File is not copied!" );
       //--- InpDst file's contents remains the same 
      FileDisplay(InpDst);
       //--- copy once more with FILE_REWRITE flag (correct copying if the file exists) 
       if ( FileCopy (InpSrc, 0 ,InpDst, FILE_REWRITE ))
         Print ( "File is copied!" );
       else
         Print ( "File is not copied!" );
     }
//--- receive InpSrc file copy 
   FileDisplay(InpDst);
  }
//+------------------------------------------------------------------+ 
//| Read the file contents                                           | 
//+------------------------------------------------------------------+ 
bool FileDisplay( const string file_name)
  {
//--- reset the error value 
   ResetLastError ();
//--- open the file 
   int file_handle= FileOpen (file_name, FILE_READ | FILE_WRITE | FILE_TXT |InpEncodingType);
   if (file_handle!= INVALID_HANDLE )
     {
       //--- display the file contents in the loop 
       Print ( "+---------------------+" );
       PrintFormat ( "File name = %s" ,file_name);
       while (! FileIsEnding (file_handle))
         Print ( FileReadString (file_handle));
       Print ( "+---------------------+" );
       //--- close the file 
       FileClose (file_handle);
       return ( true );
     }
//--- failed to open the file 
   PrintFormat ( "%s is not opened, error = %d" ,file_name, GetLastError ());
   return ( false );
  }
//+------------------------------------------------------------------+


2. Adım: MQL5 kullanarak "test" klasörünü temizleme

Senaryo:

 //+------------------------------------------------------------------+
//|                                                  FolderClean.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
//--- Description 
#property description "The script shows a sample use of FolderClean()." 
//--- Show the dialog of input parameters when starting the script 
#property script_show_inputs 
//--- Input parameters 
input string    foldername= "test" ;   // folder in MQL5/Files/ 
//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart ()
  {
//--- Start to delete files 
   PrintFormat ( "Trying to delete all files from folder %s" ,foldername);
   if ( FolderClean (foldername, 0 ))
       PrintFormat ( "Files have been successfully deleted, %d files left in folder %s" ,
                  foldername,
                  FilesInFolder(foldername+ "\\*.*" , 0 ));
   else
       PrintFormat ( "Failed to delete files from folder %s. Error code %d" ,foldername, GetLastError ());
//--- 
  }
//+------------------------------------------------------------------+ 
//| Returns the number of files in the specified folder              | 
//+------------------------------------------------------------------+ 
int FilesInFolder( string path, int flag)
  {
   int count= 0 ;
   long handle;
   string filename;
//--- 
   handle= FileFindFirst (path,filename,flag);
//--- If at least one file found, search for more files 
   if (handle!= INVALID_HANDLE )
     {
       //--- Show the name of the file 
       PrintFormat ( "File %s found" ,filename);
       //--- Increase the counter of found files/folders 
      count++;
       //--- Start search in all files/folders  
       while ( FileFindNext (handle,filename))
        {
         PrintFormat ( "File %s found" ,filename);
         count++;
        }
       //--- Do not forget to close the search handle upon completion 
       FileFindClose (handle);
     }
   else // Failed to get the handle 
     {
       PrintFormat ( "Files search in folder %s failed" ,path);
     }
//--- Return the result 
   return count;
  }
//+------------------------------------------------------------------+


3. Adım: MQL5 kullanarak "test" klasörünü silme

 //+------------------------------------------------------------------+
//|                                                 FolderDelete.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
//--- Description 
#property description "The script shows a sample use of FolderDelete()." 
#property description "First two folders are created; one of them is empty, the second one contains a file." 
#property description "When trying to delete a non-empty folder, an error is returned and a warning is shown."

//--- Show the dialog of input parameters when starting the script 
#property script_show_inputs 
//--- Input parameters 
input string    InpFolder= "test" ;     // An empty folder 
//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart ()
  {
//--- Delete the comment form the chart 
   Comment ( "" );
//--- Add a message into the "Experts" journal 
   PrintFormat ( "Trying to delete folder %s" ,InpFolder);
   ResetLastError ();
//--- Delete the empty folder 
   if ( FolderDelete (InpFolder))
       //--- The following message should appear since the folder is empty 
       PrintFormat ( "Folder %s has been successfully deleted" ,InpFolder);
   else
       PrintFormat ( "Failed to delete folder %s. Error code=%d" ,InpFolder, GetLastError ());
//--- 
  }
//+------------------------------------------------------------------+


Zorluklar nelerdir? Her şey çalışıyor.

Dosyalar:
 
Vladimir Karputov :

Zorluklar nelerdir? Her şey çalışıyor.

Bu örnek için teşekkürler. Yarın sabah çözeceğim. Şimdi güç yok.)

Her şeyi test edeceğim ve sana bir cevap vereceğim.


Katma:

Burada üç farklı senaryo getirdiniz.

Bir programım var ve dosya ve klasörleri kopyalamak, silmek tek bir işlev içinde iki döngüde gerçekleşiyor.

İlk döngüye giriyoruz: Önce kaynak dosyalar başka bir klasöre kopyalanıyor , ardından bu kaynak dosyalar siliniyor. İlk döngüden çıkıyoruz.

İkinci döngüye girme: Kaynak klasörü FolderClean() ile temizleyin ve kaynak klasörü -FolderDelete() ile silin.


Ardından, meta düzenleyicideki dosya gezginine bakıyoruz ve orijinal klasörün kısmen silindiğini görüyoruz. İçinde dosya bulunmayan alt klasörler tamamen silindi ve içinde bulundukları klasörler silinmedi, boş kaldı.

Klasörleri manuel olarak silmeye çalışıyoruz - şunu elde ederiz:



Ardından terminali kapatın ve tekrar başlayın. Görüyoruz - bazı alt klasörler kendiliğinden kayboldu, diğerleri kaldı. Elimizde sorunsuz yıkıyoruz. Bu zaman.