Una cartella non viene cancellata se contiene file non chiusi - pagina 5

 
Rashid Umarov:

Mi ricordo il tuo "ho tutte le mosse scritte" nel thread OOP vs programmazione procedurale. In questo thread ero solo convinto che non ci si può fidare di te.

Non c'è nessuna prova e nessun dettaglio - non c'è bisogno di scrivere al servicedesk.


Il mio problema con la cancellazione delle cartelle non è ancora risolto. Lo script funziona, ma non ho ancora trovato la causa del mio problema.


Ci sono tutti i tipi di possibilità. Può essere o non essere colpa mia. Sono sempre pronto a fornire le informazioni necessarie per risolvere il problema.


Il mio feedback a servicedek non è assolutamente una lamentela.

 
Rashid Umarov:

Mi ricordo il tuo "ho tutte le mosse scritte" nel thread OOP vs programmazione procedurale. In questo thread ero solo convinto che non ci si può fidare

Non so di quali mosse tu stia parlando e perché pensi che non ci si possa fidare di me. Forse ho dato un motivo per farlo, ma non ricordo esattamente dove o quando.

In ogni caso, grazie per la sua franca dichiarazione del suo atteggiamento nei miei confronti. È meglio sapere che non sapere.

 

Spero che tu capisca davvero, hai fatto un ottimo lavoro di Consigli dannosi - come non scrivere a Service Desk

 
Rashid Umarov:

Spero che tu lo capisca davvero, hai fatto un ottimo lavoro di Harmful Advice - come non scrivere al Service Desk


Ahimè, non l'ho capito. Ho cercato di essere il più chiaro e specifico possibile nel mio messaggio. Ho dato dettagli, dato un file gif, commentato il codice dello script. Quindi cosa ho fatto esattamente di sbagliato?

 

Davvero non puoi leggere l'aiuto e cambiare il codice correttamente? Come si può allora pretendere un atteggiamento diverso? Ecco il codice della guida, con le aggiunte evidenziate in giallo

//+------------------------------------------------------------------+
//|                                                Test_FileOpen.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- неправильный способ открытия файла
   string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);
   string filename=terminal_data_path+"\\MQL5\\Files\\"+"fractals.csv";
   int filehandle=FileOpen(filename,FILE_WRITE|FILE_CSV);
   if(filehandle<0)
     {
      Print("Неудачная попытка открыть файл по абсолютному пути");
      Print("Код ошибки ",GetLastError());
     }
//--- правильный способ работы в "файловой песочнице"
   ResetLastError();
   filehandle=FileOpen("fractals.csv",FILE_WRITE|FILE_CSV);
   if(filehandle!=INVALID_HANDLE)
     {
      FileWrite(filehandle,TimeCurrent(),Symbol(),EnumToString(_Period));
      FileClose(filehandle);
      Print("FileOpen OK");
     }
   else Print("Операция FileOpen неудачна, ошибка ",GetLastError());

//--- еще один пример с созданием вложенной директории в MQL5\Files\
   string subfolder="Research";
   filehandle=FileOpen(subfolder+"\\fractals.txt",FILE_WRITE|FILE_CSV);
   if(filehandle!=INVALID_HANDLE)
     {
      FileWrite(filehandle,TimeCurrent(),Symbol(),EnumToString(_Period));
      FileClose(filehandle);
      Print("Файл должен быть создан в папке "+terminal_data_path+"\\"+subfolder);
     }
   else Print("Операция FileOpen неудачна, ошибка ",GetLastError());
//---
   Print("Очищаем папку \\MQL5\\",subfolder);
   FolderClean(subfolder,1);

   Print("Удаляем папку \\MQL5\\",subfolder);
   if(!FolderDelete(subfolder,1))
      PrintFormat("Ошибка! Не удалось удалить папку  \\MQL5\\",subfolder);
  }
//+------------------------------------------------------------------+
 
Rashid Umarov:

Sei davvero incapace di leggere l'aiuto e cambiare il codice correttamente? Come si può chiedere un atteggiamento diverso? Ecco il codice della guida, con le aggiunte in giallo

Se l'atteggiamento verso la mia persona dipende dal fatto che ho fatto un errore nel codice, allora temo che qui ci sia qualcosa che non va...))

Ancora non capisco bene le sue affermazioni.

Ho postato il mio codice alterato più di una volta sul forum. Il mio unico errore è stato che dopo aver aggiunto la chiusura esplicita del file, ho dimenticato di salvare nuovamente lo script e quindi non ho visto che ha risolto il problema nello script che ho cambiato. Comunque, in ogni caso, la documentazione non dice esplicitamente che bisogna chiudere i file dopo la creazione.

Al di là di questo, come ho detto prima, il mio problema con la cancellazione delle cartelle (non dei file) è rimasto. Le cartelle non hanno più file al loro interno, ma la funzione FolderClean le cancella.

La causa non è ancora chiara.

Quindi, forse sono andato al Service Desk per una ragione dopo tutto.

Grazie per aver impiegato così tanto tempo a considerare il mio problema)).

 
Реter Konow:
Grazie. Sono contento di non essere l'unico ad affrontare questo problema. Ho bisogno di risolvere questo problema "a sangue" (non posso finire di usare il navigatore di file senza di esso). Ho scritto a servicedeck. Ma scrivo anche qui, per sicurezza. Non si è rivelato inutile).
fxsaber:

Ho visto questo tipo di cose accadere diverse volte. Ho scoperto che a un certo punto la cartella Files con tutte le sottocartelle e i file ottiene l'attributo di sola lettura. Deselezionare questa bandiera manualmente non aiuta. Ma riavviare il terminale aiuta sempre. Non sono riuscito a farlo suonare (non ci ho provato), quindi non l'ho segnalato alla SD.

Unirsi. Ho avuto in precedenza dei crash estremamente rari dall'inizio del 2014 che hanno generato un errore del sistema operativo "32 Sharing violation" in 9 tentativi di creare un file in questa cartella, andando in incrementi di 16 millisecondi di fila. Non riuscivo a capire cosa ci fosse di sbagliato. Ho dato la colpa al "radicale aggiornamento delle funzioni di gestione dei file" che era in corso in MQ in quel momento. Non si può riprodurre, solo per coincidenza c'è stato questo problema alle 20:12:42. Immediatamente, passò qualche secondo, andò a un file in quella cartella, riuscì a modificarlo correttamente e a salvarlo. Fallimento non colto.

Prima di quel crash si verificava una o due volte al mese per 5 anni, da febbraio 2014 deve essere ogni settimana, non conto quante volte. Anche se il numero di terminali in funzione simultaneamente è diminuito da 40-50 a 35.

 
Vladimir:

Accompagnamento. Ho avuto un guasto estremamente raro dall'inizio del 2014 che ha generato un errore del sistema operativo "32 Sharing violation" in 9 tentativi di creare un file in questa cartella, andando in incrementi di 16 millisecondi di fila. Non riuscivo a capire cosa ci fosse di sbagliato. Ho dato la colpa al "radicale aggiornamento delle funzioni di gestione dei file" che era in corso in MQ in quel momento. Non si può riprodurre, solo per coincidenza c'è stato un tale inconveniente proprio ora, alle 20:12:42. Immediatamente, passò qualche secondo, andò a un file in quella cartella, riuscì a modificarlo correttamente e a salvarlo. Il glitch non viene catturato.

Prima, per 5 anni questo errore appariva una o due volte al mese, da febbraio 2014 è invariabilmente ogni settimana, non potrei contare quante volte. Anche se il numero di terminali in funzione simultaneamente è diminuito da 40-50 a 35.

Tutti i miei file vengono cancellati anche senza chiuderli esplicitamente. Cancellati perché non li ho creati io e prima erano dentro la cartella Files.

Il fatto è che per cancellare un file, abbiamo bisogno del suo manico. Tuttavia, se non abbiamo creato il file, ma lo abbiamo solo messo nella cartella Files, non possiamo ottenere il suo handle, e quindi non possiamo chiuderlo con FileClose().

Allo stesso tempo, possiamo ancora copiarlo o cancellarlo. Tuttavia, la cartella non può essere cancellata dopo questo, né programmaticamente né manualmente. Manualmente solo dopo aver riavviato il terminale.

Cercherò di riprodurre il problema più chiaramente più tardi, con esempi chiari.

 
Реter Konow:

Mi si cancellano tutti i file anche senza chiuderli esplicitamente. Cancellati perché non li ho creati io e prima erano dentro la cartella Files.

Il punto è che per cancellare un file, abbiamo bisogno del suo manico. Tuttavia, se non abbiamo creato questo file, ma solo messo nella cartella Files, non possiamo ottenere il suo handle, e quindi non possiamo chiuderlo con FileClose().

Allo stesso tempo, possiamo ancora copiarlo o cancellarlo. Tuttavia, la cartella non può essere cancellata dopo questo, né programmaticamente né manualmente. Manualmente solo dopo aver riavviato il terminale.

Cercherò di riprodurre il problema più chiaramente più tardi, con esempi chiari.

Questo è probabilmente il nocciolo del problema.

Quando rinomino una cartella nel navigatore di file personalizzato, non posso usare FolderRename() perché non esiste.

Invece, copio tutti i file e le cartelle in una nuova cartella, con un nome personalizzato, e cancello i file e le cartelle originali dalla cartella originale (che rinomino). Di conseguenza, prima cancello tutti i file dalla cartella originale (dopo averli copiati nella nuova cartella) e poi uso FolderClean() per provare a rimuovere la gerarchia delle cartelle rimanenti nella cartella originale, che è già vuota. È qui che si verifica l'errore. Alcune cartelle vengono cancellate, ma una o due rimangono, proprio come la cartella di origine. Poi provo a cancellarlo manualmente e non ci riesco. Solo il riavvio del terminale aiuta.

 
Реter Konow:

Questo è probabilmente il nocciolo del problema.

Quando rinomino una cartella nel navigatore di file personalizzato, non posso usare FolderRename() perché non esiste.

Invece, copio tutti i file e le cartelle in una nuova cartella, con un nome personalizzato, e cancello i file e le cartelle originali dalla cartella originale (che rinomino). Di conseguenza, prima cancello tutti i file nella cartella originale (dopo averli copiati nella nuova cartella) e poi uso FolderClean() per cercare di rimuovere la gerarchia delle cartelle rimanenti nella cartella originale, che è già vuota. È qui che si verifica l'errore. Alcune cartelle vengono cancellate, ma una o due rimangono, proprio come la cartella di origine. In seguito provo a cancellarlo manualmente e non ci riesco. Solo il riavvio del terminale aiuta.


Per favore continuate - finché scrivete nell'affascinante genere della "fiction". Si spera che a circa pagina 40 sarete passati al genere "letteratura tecnica".

Motivazione: